LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 973|回复: 8

指针函数返回值的疑问

[复制链接]
发表于 2005-11-11 16:08:23 | 显示全部楼层 |阅读模式
如果返回函数内声明的变量的地址(包括数组),就会warning,大约是return local variable之类的。
是不是应该返回malloc得来的地址比较好呢?
发表于 2005-11-11 17:05:45 | 显示全部楼层
至少那不是一种好的设计。返回栈上的地址也不可以。一个解决方法是让调用者处理这些问题,或者,在某些情况下用静态变量。
回复 支持 反对

使用道具 举报

发表于 2005-11-11 17:09:38 | 显示全部楼层
Post by Illidan
如果返回函数内声明的变量的地址(包括数组),就会warning,大约是return local variable之类的。
是不是应该返回malloc得来的地址比较好呢?


嗯,一般不应该返回局部数据,因为那会导致不可预知的后果
回复 支持 反对

使用道具 举报

发表于 2005-11-11 17:36:23 | 显示全部楼层
返回局部变量的地址是不对的,这个会产生野指针,因为变量分配在栈里,函数一返回,栈里的变量就撤销了。
返回malloc得来的地址比较好些,strdup函数就是这样做的。但是调用者应该注意要释放这块分配在堆里的内存,否则容易产生内存泄漏。
回复 支持 反对

使用道具 举报

发表于 2005-11-11 22:05:53 | 显示全部楼层
我讨厌这样的用法,一个函数里分配的内存,却要让另外一个函数去释放!我宁可在上一层函数中分配好内存,然后把内存地址当作参数传递给下一层函数!
但linux库函数中,确实有很多是把地址return的。所以在我这样的水平就理解不了了,既然栈内存是用完就释放的,而堆地址是要手工free的,但我从来没听说过,谁调用库函数还去把返回的指针free一下,不知道这些函数是怎么实现的!
回复 支持 反对

使用道具 举报

发表于 2005-11-11 23:33:00 | 显示全部楼层
很多阿
getline
strdup
就是用malloc
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-13 19:48:58 | 显示全部楼层
对于这样的函数能不能用链式表达?

比如我写的一个char* get_str(),
通过malloc返回一个指针。
我觉得调用时应该这样写:

  1. char str[LEN];
  2. char* temp = get_str();
  3. strcpy(str, temp);
  4. free(temp);
复制代码



如果用链式表达:

  1. char str[LEN];
  2. strcpy(str, get_str());
复制代码

似乎没有办法free,会不会有泄漏?
回复 支持 反对

使用道具 举报

发表于 2005-11-13 20:34:55 | 显示全部楼层
不能这么干吧,会泄露的
回复 支持 反对

使用道具 举报

发表于 2005-11-13 21:54:08 | 显示全部楼层
Post by Illidan
对于这样的函数能不能用链式表达?

比如我写的一个char* get_str(),
通过malloc返回一个指针。
我觉得调用时应该这样写:

  1. char str[LEN];
  2. char* temp = get_str();
  3. strcpy(str, temp);
  4. free(temp);
复制代码



如果用链式表达:

  1. char str[LEN];
  2. strcpy(str, get_str());
复制代码

似乎没有办法free,会不会有泄漏?

一定泄露啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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