标题:堆栈与return返回【摘】
取消只看楼主
gaoce227
Rank: 4
来 自:山东
等 级:业余侠客
帖 子:134
专家分:218
注 册:2008-4-5
 问题点数:0 回复次数:1 
堆栈与return返回【摘】
1、在函数体的“出口处”,对return语句的正确性和效率进行检查。
   如果函数有返回值,那么函数的“出口处”是return语句。我们不要轻视return语句。如果return语句写得不好,函数要么出错,要么效率低下。
注意事项如下:
(1)return语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。例如
char * Func(void)
{
   char str[] = “hello world”; // str的内存位于栈上
   …
   return str;   // 将导致错误
}

问题
1、认真研读了林锐的 < <高质量C++>>,其中指出return不能返回指向栈内存的指针或引用,根据书中所举的例子,自己有所疑问,希望哪个前辈解释一下!案例如下所示:
char *GetMemory(int num)
{
char *p = (char *)malloc(sizeof(char)*num);
return p;
}

void main(void)
{
char *str = NULL;
str = GetMemory(100);
strcpy(str, "hello world!");
cout < < str < < endl;
free(str);
str = NULL;
}
请教:例子中返回的指针P是不是指向栈内存,如果是,则函数结束时动态内存应该释放呀,那么该程序就运行出错,为什么书中的这个程序是正确的呢?

解答:
这个例子中p是指向堆的内存指针。
你关于堆和栈基本概念没有搞清楚。
在C中通过malloc分配的内存都是指向堆的。
如果你想测试指向栈的内存
要这样分配
char p[100];
return p;

malloc或new动态申请的内存是堆上的内存,所以没有错误。

关于return返回的知识繁多,各位总结一下吧!





[ 本帖最后由 gaoce227 于 2010-5-30 13:27 编辑 ]
搜索更多相关主题的帖子: return hello world 
2010-05-30 11:59
gaoce227
Rank: 4
来 自:山东
等 级:业余侠客
帖 子:134
专家分:218
注 册:2008-4-5
得分:0 
觉着不错,就弄来了。
2010-05-30 12:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-308698-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.461102 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved