LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: marvel

函数如何返回变长字符串?

[复制链接]
发表于 2006-5-8 11:06:35 | 显示全部楼层
Post by Lolita
第一个没问题吧,虽然走了弯路,但也是对的。
我错了, 对数组名取地址没意义,因为数组名本身就是指针而不是指针变量。
所以楼主的实参 &buf 其实就等于 buf , 而不是 char **

一定要用char ** 方式传递的话,可以如下操作。
  1. #include <stdio.h>
  2. void foo(char **buf)
  3. {
  4.   (*buf)[0] = 'T';
  5. }
  6. int main()
  7. {
  8.   char buf[10]="test";
  9.   char *s=buf;
  10.   printf("original: %s\n", buf);
  11.   foo( &s );
  12.   printf("changed: %s\n", buf);
  13.   return 0;
  14. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-5-8 18:16:52 | 显示全部楼层
Post by danath
如果不是只能用c的话,可以返回std::string对象啊.

返回对象会导致调用拷贝构造,产生大量的内存复制过程,降低效率
回复 支持 反对

使用道具 举报

发表于 2006-5-8 20:08:19 | 显示全部楼层
Post by x11
返回对象会导致调用拷贝构造,产生大量的内存复制过程,降低效率

但是返回指针或引用更可能发生指针/引用悬空。如果是用new的话,和C语言就没什么区别了。

IMHO,让一个函数返回指针一定意义上多少是一种设计上的缺陷,即使使用引用计数的智能指针多少也会有额外开销。资源应该由调用者管理,函数通过引用或指针来操作调用者分配的资源。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-9 12:04:21 | 显示全部楼层
多谢Lolita兄,的确是我疏忽了。
脑子里有一个构思就写下来了,没有验证,呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-9 12:09:19 | 显示全部楼层
用free就怕有条件,
if(...)
  free(buf);

//do something with buf
.....

如果多种情况下到最后就可能漏了free(buf),所以我在想有没有自动化释放的办法。不想java和C#不用管这些,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

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