LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2006-5-7 21:22:35 | 显示全部楼层 |阅读模式
有一个问题请教大家:

假定一个函数

foo()
{
}

我希望foo处理之后,我能够得到一个字符串,但是之前我并不知道这个字符串的长度。

我想了想,一种方法是

  1. main()
  2. {
  3.       buf[1024];
  4.       foo(&buf,1024);
  5. }
  6. void foo(char **buf,size_t len)
  7. {
  8.      //Modify buf
  9. }
复制代码


另一种是:

  1. char[] foo()
  2. {
  3.      char buf[1024];
  4.      ...
  5.      return buf;

  6. }
  7. 但是这两个始终是定长的,有可能会溢出。
  8. 如果在foo中使用malloc的话,那么在main中就需要free了,不方便。
  9. 不知道大家有什么好的主意没有

  10. BTW,本人的代码可能有错,blush~~
复制代码
发表于 2006-5-7 21:30:14 | 显示全部楼层
第二个一定是错的,本地数组当函数返回后就可以被随便覆盖的,里面的值会被破坏的
变长数组一般也就是malloc了,除此之外没什么其他方法了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-7 21:33:37 | 显示全部楼层
哦,对了。谢谢提醒。刚才编译了一下,除了warning了。返回local指针是非法的,呵呵

如果是只能malloc的话,估计只能看开发者的素质了,尽量free和malloc匹配上
回复 支持 反对

使用道具 举报

发表于 2006-5-7 22:41:23 | 显示全部楼层
当然得有借(malloc)有还(free)了
回复 支持 反对

使用道具 举报

发表于 2006-5-8 00:06:18 | 显示全部楼层
第一个也是错的

可以在函数里malloc,由调用者负责释放,不过不太好
还可以用static的函数内数组
回复 支持 反对

使用道具 举报

发表于 2006-5-8 07:51:28 | 显示全部楼层
第一个没问题吧,虽然走了弯路,但也是对的。

完全可以改成这样:
main()
{
      buf[1024];
      foo(buf,1024);
}
void foo(char *buf,size_t len)
{
     //Modify buf
}

如果要用传递指针,并为指针分配指向的内存块,则必须用 char **传递实参,而不能用char *
回复 支持 反对

使用道具 举报

发表于 2006-5-8 10:25:26 | 显示全部楼层
  1. #include <stdlib.h>
  2. #include <string.h>

  3. void foo(char **buf, int len)
  4. {
  5.   *buf = (char *)malloc(2000);
  6.   strcpy(*buf, "hello");
  7. }

  8. int main()
  9. {
  10.   char buf[1000];
  11.   strcpy(buf, "test");
  12.   printf("%s\n", buf);
  13.   foo(&buf, 1000);
  14.   printf("%s\n", buf);
  15.   return 0;
  16. }
复制代码

自己试试看,反正我这里是得不到预期结果
回复 支持 反对

使用道具 举报

发表于 2006-5-8 10:35:56 | 显示全部楼层
你这个测试程序就有问题, main()中的buf是个数组名常量(相当于指针常量),企图在foo()中通过修改buf是错误的。

楼主的意思是修改buf[]数组中的内容而不是buf本身吧。
回复 支持 反对

使用道具 举报

发表于 2006-5-8 10:48:15 | 显示全部楼层
$ gcc -o test test.c
test.c: In function `main':
test.c:15: warning: passing arg 1 of `foo' from incompatible pointer type

$ ./test
test
xQ=


  1. #include <stdlib.h>
  2. #include <string.h>

  3. void foo(char *buf, int len)
  4. {
  5.   buf = (char *)malloc(2000);
  6.   strcpy(buf, "hello");
  7. }

  8. int main()
  9. {
  10.   char buf[1000];
  11.   strcpy(buf, "test");
  12.   printf("%s\n", buf);
  13.   foo(buf, 1000);
  14.   printf("%s\n", buf);
  15.   return 0;
  16. }
复制代码

$ gcc -o test test.c
$ ./test
test
test
回复 支持 反对

使用道具 举报

发表于 2006-5-8 10:54:44 | 显示全部楼层
如果不是只能用c的话,可以返回std::string对象啊.
回复 支持 反对

使用道具 举报

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

本版积分规则

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