堆栈与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 编辑 ]