函数返回buffer的方法
今天写代码,发现一个比较低级的错误,请看如下示例:
void function(char* ret_buf,int size)
{
ret_buf = (char*)malloc(size);
strcpy(ret_buf,"string from function\n");
return;
}
#include<stdio>
int main()
{
char* buf = NULL;
function(buf, 128);
printf(buf);
free(buf);
return 0;
}
错误发生在传递函数参数那一刻,buf作为指针,依然是按值传递给了函数,也就是,拷贝了该指针的一个副本,在子函数中进行内存分配,返回主函数后,主函数的buf变量根本就没有收到function函数调用的任何影响,而同时,function内部malloc的内存将会泄露,而主程序中的free调用将面对的是一个空指针。
所有的错误都是因为对按值传参的忽略导致。所以,要想从子函数中带回buffer,我想到的是用返回值。而这正好也是利用了按值传递的原理。请看下面的例子:
char* function(int size)
{
char* ret_buf = (char*)malloc(size);
strcpy(ret_buf,"string from function\n");
return ret_buf;
}
#include<stdio>
int main()
{
char* buf = NULL;
buf = function(128);
printf(buf);
free(buf);
return 0;
}
这样,当我们返回function内部的局部变量ret_buf时,将copy一个副本,其中存储了malloc生成的一片缓冲区。于是,可以在主函数中操作其内容。
我想到这么一个方法,不知道大家还有什么好方法可以buffer。
[解决办法]
void function(char* *ret_buf,int size) {
*ret_buf = malloc;
}
[解决办法]
char* function(int size)
跨模块的时候,最好提供一个函数来free
[解决办法]