原创 关于返回局部变量的思考

2011-10-21 23:44 1445 6 6 分类: 工程师职场

思考了半天,还不如百度一下,结果真发现了解释,,内牛满面啊

//Test2.cpp
#include <cstdio>

char* get_str()
{
char *str = {"abcd"};//可以
//char str[] = {"abcd"};//错误,结果不确定
    return str;
}

int main()
{
char* p = get_str();
printf(
"%s ", p);

return 0;
}

char *str = {"abcd"};//可以,是因为"abcd"是一个字符串常量,它并不在一个栈空间上,而是在静态存储区上。
字符串的生命周期是:程序开始时分配,程序结束时释放。
(当然,str是一个指针变量,在栈空间上,因此函数返回时会释放,但是所指为字符串常量,字符串常量所占空间在函数返回时不会释放)

而char str[] = {"abcd"};//错误,结果不确定,虽然从编译器的实现来看(见如下代码(VC6下)的结果),"abcd"仍然是当成一个字符串常量,但是程序又 把它复制了一次,放在了栈空间上,返回的时候str所指的是栈上的这一块字符串。问题的本质仍然是由于返回了指向栈空间的指针。

另外一篇解释:

关于局部变量的返回,准确的说应该是:不能通过return 返回指向栈内存的指针!请看下 面的两个例子:
//----------------------------------------------------1[
错误]------------------------------------------------------------------

#include "stdafx.h"

char* rttemp1(void)

{

     char arr[]="hello,world\n"; //arr[]所有元素保持在栈内存 上,arr是个符号地址,没有存储空间

     return arr;            //warning C4172: 返回局部变量或临时变量的地址 //即 警告返回了指向栈内存的指针,返回后栈内存都会被自动回收

}

int _tmain(int argc, _TCHAR* argv[])

{

     printf("%s",rttemp1());      //可能刚好打印出hello,world,也可能打印出垃圾数据,取决于编译器对栈内存回收的处理方法

     return 0;

}

//-----------------------------------------------------2[正确]------------------------------------------------------------------

#include "stdafx.h"

char* rttemp1(void)

{

     char *arr="hello,world\n"; //"hello,world\n" 保存在只读常量区,非栈内存不受函数返回影响

     return arr;                      //其实返回的是arr的副本,返回后arr变 量也销往,但是其指向常量区不受影响

}

int _tmain(int argc, _TCHAR* argv[])

{

     printf("%s",rttemp1());     //能打印出hello,world

     return 0;

}

//如果确实要返回一个局部变量的地址,可以采用 static 方式,如下

--------------------------------------------------------3[正确]---------------------------------------------------

#include "stdafx.h"

char* rttemp1(void)

{

     static char arr[]="hello,world\n";   //"hello,world\n" 保存在静态存储区,非栈内存不受函数返回影响。同1,arr是个符号地 址,没有存储空间

     return arr;                     

}

int _tmain(int argc, _TCHAR* argv[])

{

     printf("%s",rttemp1());     //能打印出hello,world

     return 0;

}

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条