C語言--區域性變數作為指標返回值的問題
阿新 • • 發佈:2019-01-02
程式碼:
#include <stdio.h>
#include <stdlib.h>
int* getStu(int x, int y)
{
int* i;
*i = x+y;
return i;
}
int main()
{
int x = 2, y = 3;
int *s = getStu(x, y);
printf("%d %d %d\n",x,y,*s);
return 0;
}
這段程式碼會崩潰,原因分析如下:
首先需要明確區域性變數,是存放在棧空間上的,當一個函式被呼叫,會開闢一個棧空間,用來儲存在這個函式中定義的區域性變數,當函式返回後,棧空間會被釋放掉,區域性變數也就隨之被釋放掉
然後可以知道當在一個被呼叫的函式中宣告一個區域性指標變數,並讓其作為這個函式的返回值,這個時候gcc編譯會通過,但是執行時就會崩潰,原因就是使用了野指標,而這個野指標的產生原因就是因為區域性變數指標返回的時候被釋放掉了,指向了野指標,而在呼叫這個函式時使用了這個返回值,因此導致崩潰
解決辦法:
1、將函式實現中的區域性變數定義為static
2、將返回的值定義為全域性變數
這樣解決的原因是因為static變數與全域性變數都是將資料儲存到靜態儲存區上,不會因為函式返回而被釋放掉