函數的局部變量用作函數返回值


函數的局部變量用作返回值時,會生成一個局部變量的拷貝用作返回值,之后局部變量會被系統回收,函數不能返回局部變量的地址,因為如果返回局部變量的地址,系統回收后,指針指向的內容就無意義了,但是對於靜態變量也可以返回其指針。

#include "stdio.h"

int *a()
{
    int b;
    int *p;
    b=23;
     printf("b=%d \n",b);
    return &b;

}
void main()
{

   int *r;
   r=a();
//printf("");
   printf("r=%d",*r);
   getch();
}
如以上代碼,函數返回的是局部變量的指針,此時在主函數里打印出的r應該不等於23,可是實際結果卻是23,當在打印結果之前再添加一個printf語句時打印的結果才不會是23,在CSDN上討論:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7cb7404e5.html?seed=1431559918&r=77464424#r_77464424,這里系統可能沒及時回收局部變量才導致打印出的還是局部變量的值
 
具體的應該如下:
 

1. 如果返回一個基本類型的變量,比如:

int a;

a = 5;

return a;

那么就會a的一個拷貝,即5返回,然后a就被銷毀了。盡管a被銷毀了,但它的副本5還是成功地返回了,所以這樣做沒有問題。

2. 但是對於指針,像1那么做就會有問題,比如在某個函數內部:

int a[] = {1, 2};

return a;

那么也會返回指針a的一個拷貝,我們假定a的地址值為0x002345FC,那么這個0x2345FC是能夠成功返回的。當return執行完成后,a就要被銷毀,也就是0x002345FC所指向的內存被回收了。如果這時候在函數外面,去地址0x002345FC取值,那得到的結果肯定是不對的。這就是為什么不能返回局部指針的原因。返回局部變量的引用的道理和這個類似。

3. 對於靜態變量:

static int b=10;

return &b;

由於靜態變量是存放在靜態存儲區的,所以不會被系統回收,所以返回值還是有效的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM