函数返回局部变量问题


2010-07-12 22:59:20|  分类 笔试面试 |  标签 |字号 订阅

           在林锐的《高质量编程》里提到过用局部变量分配空间,将指针返回后分配的内存将释放,指针变成野指针,也就是说不能返回局部变量,不过这个不能返回局部变量是针对指针而言的,并不是说所有的局部变量不能返回,先举个例子来说明可以函数可以返回局部变量的例子.

Date&  getdate( )

       {

             Date  dt  =  {6,  24,  40};

             return  dt;

       }

C++编译器会在返回局部变量的引用代码时发出警告。原因是,一旦函数返回,局部变量dt占用的内存块就会从栈内释放,而返回的类型是“引用”,那么引用的对象的内存已经释放,相应内存地址存放的内容不能再保证是变量bt了,如果这时候其他设备或者任务中断使用了栈内存,那就会产生不可估计的错误。

        改进的办法有两种

        一是

       Date  getdate( )

       {

             Date  dt  =  {6,  24,  40};

             return  dt;

       }

这就使函数返回的类型不是引用类型,那么在函数结束前,将要被返回的局部变量dt会先被创建一个副本,然后函数结束了,dt占用的栈内存消失了,但副本可以被返回。这是最常用的函数返回类型。

       二是

       Date&  getdate( )

       {

             static Date  dt  =  {6,  24,  40};

             return  dt;

       }

使变量dt的内存分配在全局数据区进行,这样的话,直到整个程序结束前,变量bt是不会消失的,那么对它的引用不会出现问题。

另外针对,字符串常量,可以有以下几种情况,要注意区分:

看看下面的程序的输出

#include <stdio.h>
char *returnStr()
{
    char *p="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s\n", str);
    
    return 0;
}


这个没有任何问题,因为"hello world!"是一个字符串常量,存放在静态数据区,
把该字符串常量存放的静态数据区的首地址赋值给了指针,
所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

但是,下面的就有问题

#include <stdio.h>
char *returnStr()
{
    char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s\n", str);
    
    return 0;
}

"hello world!"是一个字符串常量,存放在静态数据区,没错,
但是把一个字符串常量赋值给了一个局部变量(char []型数组),该局部变量存放在栈中,
这样就有两块内容一样的内存,这是与前着最本质的区别,
当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,
所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。

如果函数的返回值非要是一个 局部变量的地址,那么该局部变量一定要申明为static类型。如下

#include <stdio.h>
char *returnStr()
{
    static char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s\n", str);
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值