1. 程式人生 > >C/C++中關於函式呼叫結束後變數釋放的問題

C/C++中關於函式呼叫結束後變數釋放的問題

問題:

#include <stdio.h>
int* fa();

void main()
{
int *p=fa();
printf("%d\n",*p);
}

int* fa()
{
int i=97;
return &i;
}

我記得書上說過當函式呼叫結束後,函式中所定義的區域性變數會全部被釋放,也就是函數fa()中的變數i在呼叫結束後會被釋放,為什麼這裡還能引用輸出函式fa()中的區域性變數值呢?

解答:

其實這麼引用很危險,非常不推薦。
fa()執行完畢後,i被釋放,其實是指將編譯器中對於該地址的控制給釋放。
這塊地址是存在的,但是已經沒有受控的指標指向它。
&i目前也就成為我們所說的野地址。
當前這塊地址有可能已經被其他程式/系統其他程序所使用,
也有可能還沒有被使用。

所以當前*p指向的內容是不可預測的。

但是由於這個程式執行非常快,很大可能是&i這個地址內的值還是原先賦的值。

但是這麼訪問很危險,一旦這塊地址已經被系統或者其他應用程式使用,對於它的訪問,有可能導致異常。