+ -
当前位置:首页 → 问答吧 → c函数能返回一个数组吗?

c函数能返回一个数组吗?

时间:2010-08-23

来源:互联网

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

  4. // return a char array
  5. char *ch_return()
  6. {
  7.         char hello[] = "Hello";
  8.         char *str = hello;

  9.         return str;

  10. }

  11. int main()
  12. {
  13.         char *str;
  14.         str = ch_return();

  15.         printf("The value is %s\n", str);

  16.         return 0;

  17. }
复制代码
各位高人,请看代码,本人想实现一个功能函数返回一个数组的指针,可打印的结果却出人意料,不知为何。。。
更近一步,真正的目的是想通过返回一个指针数组的指针,来返回任意多个返回值,不知可行否,请高人指教

作者: liunxcu   发布时间: 2010-08-23

  "想实现一个功能函数返回一个数组的指针" 不用malloc不可以

作者: zhangsuozhu   发布时间: 2010-08-23

static char hello[] = "Hello";

这样可以

作者: hellioncu   发布时间: 2010-08-23

你可以把数组用struct包装一下,然后返回回来。但是这种返回都是数据的复制,调用次数多,或者是数组比较长的话会很耗时。

作者: davelv   发布时间: 2010-08-23

函数内数组的空间会在返回后释放,所以你还是malloc吧

作者: daybreakcx   发布时间: 2010-08-23

好奇怪的想法,我怎么没想过……

你自己调ESP指针就行了

作者: pk8995   发布时间: 2010-08-23

回复 hellioncu


    对

作者: zhangsuozhu   发布时间: 2010-08-23

在函数外定义一个单向链表的struct,函数修改好后,返回链表的头地址不行吗?

作者: ddgfff   发布时间: 2010-08-23

其实应该char *hello = "hello";也行的,只不过直接放.rodata段了

作者: daybreakcx   发布时间: 2010-08-23

谢谢各位了,用malloc固然很好,可是如果调用者用完此函数后,却没有释放掉,不知会成为隐患吗?尤其当调用者并不知道此函数内部使用了malloc,而没有释放掉,

作者: liunxcu   发布时间: 2010-08-23

建议楼主去看一下《高质量C/C++编程指南》,看完之后,关于内存这一块就什么都明白了!

作者: zhuqing_739   发布时间: 2010-08-23

谢谢高人指点

作者: liunxcu   发布时间: 2010-08-23

回复 liunxcu


    好多公司都用这道题来考应试者。

作者: rune_zhang   发布时间: 2010-08-23



QUOTE:
谢谢各位了,用malloc固然很好,可是如果调用者用完此函数后,却没有释放掉,不知会成为隐患吗?尤其当调用 ...
liunxcu 发表于 2010-08-23 15:27



貌似我上面的帖子被无视了
你在接口文档上写清楚,这块内存是需要手工释放的就可以了。
没有要求你传入内存地址,而返回了指向数据的指针的函数都是需要手工释放的,或者是静态内存,不可重入的。
例如malloc,例如ctime

作者: davelv   发布时间: 2010-08-23

回复 davelv
谢谢指教,这才明白可重入与不可重入讲的是这个意思啊

作者: liunxcu   发布时间: 2010-08-23

要返回上一个调用栈里的栈数据,手动改ESP指针防止函数退出时把栈恢复了
用的时候自己算一下位置,总之最后把栈调平衡了就行
这样姑且算是返回一个数组吧,真正返回一个数组显然不可能了,返回值一般约定放在EAX,哪放的下一个数组啊,呵呵

作者: pk8995   发布时间: 2010-08-23

回复 pk8995
高手啊,这么深入啊,

作者: liunxcu   发布时间: 2010-08-23



QUOTE:
要返回上一个调用栈里的栈数据,手动改ESP指针防止函数退出时把栈恢复了
用的时候自己算一下位置,总之最后 ...
pk8995 发表于 2010-08-23 16:11



这样调用次数多了,栈就溢出了。

作者: davelv   发布时间: 2010-08-23



QUOTE:
这样调用次数多了,栈就溢出了。
davelv 发表于 2010-08-23 16:21




    这是另一个问题……

作者: pk8995   发布时间: 2010-08-23

像这种情况,我觉得还是讲所用到的指针作为一个函数参数传递进去,这样能省去太多的麻烦,同时使得程序更加健壮。指针的使用上,我觉得还是慎重点好,否则以后出了问题,调试起来会可能比较麻烦。

作者: hanzengbo   发布时间: 2010-08-23



QUOTE:
这是另一个问题……
pk8995 发表于 2010-08-23 16:22


可以返回数组的,你用struct包装一个看看就知道了,返回值不一定是用EAX寄存器,如果超过了寄存器长度的返回值就用内存复制的方法来处理。

作者: davelv   发布时间: 2010-08-23

本帖最后由 pk8995 于 2010-08-23 16:54 编辑


QUOTE:
可以返回数组的,你用struct包装一个看看就知道了,返回值不一定是用EAX寄存器,如果超过了寄存器长度的返 ...
davelv 发表于 2010-08-23 16:28




    呵呵,都说了是返回数组了哥们。struct A fun();这样编译器是知道A的size的,所以在函数调用后会跟一段memcpy的代码,但是写char [100] fun();这样的东西是不行的,而写char []fun(),这样就丢失了长度信息了~
  还有除了基本上常见的调用约定都是从eax返回的,当然自己手写的是另一回事儿,我也见过用esi返回值的变态

作者: pk8995   发布时间: 2010-08-23



QUOTE:
呵呵,都说了是返回数组了哥们。struct A fun();这样编译器是知道A的size的,所以在函数调用后会 ...
pk8995 发表于 2010-08-23 16:50



如果严格按照楼主说的来看,你的说法没错,道理也是正确的。但是struct里面的数组也是数组阿,不能一棒子打死嘛。

作者: davelv   发布时间: 2010-08-23