VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1746|回复: 13

函数如何返回一个不定长的数组?

[复制链接]

3

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-2-29 23:00:01 | 显示全部楼层 |阅读模式
in是输入参数
out是输出参数
outlength也是输出参数,是out数组的长度
void fun(unsigned char *in,unsigned char *out,int outlength)
{


}

我既然不知道out的长度,那么我如何传out这个参数呢?
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-10 12:00:01 | 显示全部楼层
传 指针 就可以了,
长度用 outlength 给定, outlength  使用 引用 传递就可以了

void fun(unsigned char *in,unsigned char *out,int &outlength)
{
  ....  //这里给 *out 和 outlength 赋值, 就可以把内容传递出去了
}
回复

使用道具 举报

1

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-5-10 14:30:01 | 显示全部楼层
#include <iostream>
using namespace std;
void fun(unsigned char *in,unsigned char *out,int *outlength)
//or yin yong
{
        strcat((char *)out,(char *)in);
        strcat((char *)out," but add a tail!!");
        *outlength=strlen((char *)out);
}

void main()
{
        char _in[1024];
        char _out[1024];
        int len=0;
        memset(_in,0,sizeof(_in));
        memset(_out,0,sizeof(_out));
        strcpy(_in,"thi is in buf!!");
        fun((unsigned char *)_in,(unsigned char *)_out,&len);
        cout<<_in<<endl;
        cout<<_out<<endl;
        cout<<len<<endl;
        system("pause");
}
你这个函数定义是传不出长度的!
回复

使用道具 举报

0

主题

25

帖子

19.00

积分

新手上路

Rank: 1

积分
19.00
发表于 2020-5-10 15:00:01 | 显示全部楼层
改成這樣

void fun(unsigned char *in,unsigned char **out,int *outlength)
{
  *outlength = 200;
  *out = malloc(outlength+1) ;

}

char *dest = NULL;
char *in;
int len ;
fun(in, &out, &len)


回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-5-10 20:00:01 | 显示全部楼层
void fun(unsigned char *in, char **out,int& outlength)
{
        *out=new  char[10];
        strcpy(*out,"aaa");
        outlength=10;
}
int main()
{
         char* p;
        int n;
        fun(NULL,&p,n);

        delete []p;
        return 0;
}
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-5-10 21:30:01 | 显示全部楼层
传一个vector对象出来不好吗?
回复

使用道具 举报

0

主题

14

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-5-11 10:15:02 | 显示全部楼层
vector<basic_string<unsigned char> > fun(const vector<basic_string<unsigned char> > &in)
{


}
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-11 13:30:01 | 显示全部楼层
比如:

#include <cstring>
#include <cstdlib>
#include <iostream>

using namespace std;
void fun(unsigned char *in,unsigned char *&out,int &outlength)/*参数都使用引用好了*/
{
  outlength = strlen((char *)in)+1;
  out = new unsigned char[outlength];
  strcpy((char *)out, (char *)in);
}

int main()
{
        unsigned char src[]="Hello World";
        unsigned char *dest=NULL;
        int len;
       
        fun(src, dest, len);
        cout<<"Length is "<<len<<endl<<dest;
        free(dest);
        cout<<endl<<endl;
       
        strcpy((char *)src,"GoodBye");
        fun(src, dest, len);
        cout<<"Length is "<<len<<endl<<dest;
        free(dest);
        cout<<endl<<endl;
   
    system("pause");
    return 0;   
}
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-5-14 12:45:01 | 显示全部楼层
除了LS所贴的在函数内部分配内存的方法外,另一种思路就是在函数外部(也就是函数调用之前)就分配内存区域:
1.在函数调用之前事先分配SIZE大小的内存区域;
2.将内存缓冲区的地址和大小作为参数传入函数,并将函数内使用的内存大小作为返回值传出,这样函数的原型可以是这样的:
  int foobar(void* in, void* out, int buffersize);
3.在函数内部我们是知道我们需要多少内存大小的:
  如果buffersize >= 需要的内存大小,将结果填充到缓冲区内;
  如果buffersize <  需要的内存大小,缓冲区保持不变,需要的内存大小作为返回值返回;
4.根据缓冲区的变换情况来判断操作是否成功,如果不成功,使用返回值(需要内存的大小)重新分配足够大的内存区域再次调用这个函数。
5.使用完缓冲区后,释放缓冲区

和函数外部分配内存比较,在函数内部分配内存在内存谁释放的问题。
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-5-15 12:00:01 | 显示全部楼层
这么搞,返回值类型会有问题的:
vector<basic_string<unsigned char> > fun(const vector<basic_string<unsigned char> > &in)
{

}


差不多也就能这样,不过不建议内部分配,外部使用。
void fun(unsigned char *in,unsigned char **out,int *outlength)
{
  *outlength = 200;
  *out = malloc(outlength+1) ;

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表