读书人

函数返回buffer的方法解决办法

发布时间: 2012-06-19 14:45:20 作者: rapoo

函数返回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
[解决办法]

探讨

void function(char* *ret_buf,int size) {
*ret_buf = malloc;
}

[解决办法]
探讨

参数传递是值传递..
真搞不懂啊,为啥非要在一个函数中申请内存,而在另外一个函数中释放内存呢
改成下面的不是更好吗?

C/C++ code

#include<stdio>

int main()
{
char *buf = NULL;
buf = (cahr *)malloc(128);
strcpy(buf, "string from function\n……

[解决办法]
char* buf = NULL;

buf为空时,传进函数里面也为空。

申请空间,不进行操作。、
[解决办法]
二级指针
[解决办法]
多读一些优秀的书籍,对于开发者稳固编程基础、提高编程技能有很大帮助。但是,大多时候,初学者不知道应该读什么书入门,有一定基础的开发者不知道如何进阶。
http://blog.sina.com.cn/s/blog_5ce5700e010152hf.html

[解决办法]
高质量编程 这本书
[解决办法]
函数的结果要么用返回值,要么用参数,要么用变量(类成员,全局变量等)传出来

三种方法无所谓哪种更好,只是哪种更适合你的工程而已,一般都是三种混用的

返回值void用参数传递结果的函数又不是没有

读书人网 >C语言

热点推荐