本文转自:http://hi.baidu.com/x_security/blog/item/a6f3d619baeca073dbb4bdc4.html
关于局部变量的返回,准确的说应该是:不能通过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;
}