函数返回局部变量

本文转自: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值