Chinaunix

标题: 函数返回局部变量的问题 [打印本页]

作者: zhongyj    时间: 2011-11-06 18:39
标题: 函数返回局部变量的问题
《C专家编程》里面的
  1. char * licalized_time()
  2. {
  3.     char buffer[120];
  4.     ......
  5.     return buffer;
  6. }
复制代码
这里有可能出错。
但是经常在很多函数里面有返回局部int变量的,好像都没有问题
  1. int func()
  2. {
  3.     int ret;
  4.     ......
  5.     return ret;
  6. }
复制代码
只是前面返回的是局部的char[],后面的返回的是局部的int
为什么前面的不能,后面的能呢
作者: zhongyj    时间: 2011-11-06 18:46
不好意思,用的无线不稳定,以为没发出来,发重了
作者: pmerofc    时间: 2011-11-06 19:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: cjaizss    时间: 2011-11-06 19:54
2004年注册的,问这么一个问题,不应该啊
作者: 三月廿七    时间: 2011-11-06 20:42
2004年注册的,问这么一个问题,不应该啊
cjaizss 发表于 2011-11-06 19:54


存在即合理呀,
作者: jeung    时间: 2011-11-06 20:44
2004年注册的,问这么一个问题,不应该啊
cjaizss 发表于 2011-11-06 19:54



    {:3_196:} 这个……cu的板块有很多的
作者: cjaizss    时间: 2011-11-06 20:51
这个……cu的板块有很多的
jeung 发表于 2011-11-06 20:44



    是这样的,第一个第二个都没有什么不合理的,本来都是返回了一个值而已.关键在于调用第一个函数的调用者意图,它需要拿这个返回值作为内存访问的依据,而这段内存语言逻辑上已经不存在了.
作者: 三月廿七    时间: 2011-11-06 20:54
回复  zhongyj


   
不是可能,而是必定

第一个返回的是一个char *类型的指针,指向数组的起始元 ...
pmerofc 发表于 2011-11-06 19:48


顺便我也问一句,如果换成下面的会是什么情况??

char * licalized_time()
{
    char buffer[120] = “abcdefg”;
    ......
    return buffer;
}
作者: pandaiam    时间: 2011-11-06 21:04
楼上,你的意思应该是这样吧

char *buffer = "abcdefg";
作者: 三月廿七    时间: 2011-11-06 21:06
楼上,你的意思应该是这样吧

char *buffer = "abcdefg";
pandaiam 发表于 2011-11-06 21:04


恩,
作者: leaaaa    时间: 2011-11-06 21:31
回复 10# 三月廿七
返回的是文字常量区的地址
作者: pmerofc    时间: 2011-11-06 21:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: suosuopuo    时间: 2011-11-07 00:26
回复 10# 三月廿七


    "abcdefg"在静态数据区,生存期是整个程序运行的时间,返回它的地址是可以的。。。
作者: 三月廿七    时间: 2011-11-07 09:13
回复  三月廿七

这个也不行,9楼那种倒是没什么问题。9楼的写法和1楼的第二段在本质上是一样的
pmerofc 发表于 2011-11-06 21:31


9楼的写法和1楼的第二段在本质上是一样的

struct String
{
     char* s;
};

String s ;

第一种: s.s = "abcde";

第二种: s.s = malloc(10);  
             memcpy(s.s, "abcde", 10);

这两种情况是不是需要分别对待呢??

第二种使用的时候是不是用了两倍于第一种的内存??
作者: pmerofc    时间: 2011-11-07 19:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: 三月廿七    时间: 2011-11-07 20:54
本帖最后由 三月廿七 于 2011-11-07 21:03 编辑

回复 15# pmerofc
我是说  "abcede" 一份保存在静态存储区, 一份保存在 堆中,

"abcdefg"在静态数据区,生存期是整个程序运行的时间,返回它的地址是可以的。。。
这句话正确吗??
作者: pmerofc    时间: 2011-11-07 21:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 三月廿七    时间: 2011-11-07 21:15
我认为两个都需要保存 "abcde" 这个String literal ,生存期为程序执行期。当然优化的可能性这里 ...
pmerofc 发表于 2011-11-07 21:13


明白了,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2