C指標函式中的區域性變數返回
阿新 • • 發佈:2018-11-07
所謂指標函式其實就是 :一個函式的返回值為指標。
指標函式定義:返回型別識別符號* 函式名(形參列表){函式體}
eg: int* fun1(int n){}
指標函式和區域性變數返回解析:
簡單例子
#include<stdio.h> #include <unistd.h> int* fun1(int n); int main(void){ int n=100; int *p_sum=fun1(n);
printf("%d",*p_sum); //結果5050 sleep(1); printf("%d",*p_sum); //結果隨機值 return 0; } int* fun1(int n){ int sum=0; int *p=∑ int i=0; for(i=1;i<=n;i++){ sum+=i; } return p; }
在window系統下編譯器為DEV,返回結果為5050。
ubuntu下,返回結果為一個隨機地址。(作業系統不同)
下面從ubuntu,詳細解析一下,加入sleep之後,為何值會發生改變(隨機地址)。
1.fun1是一個指標函式,被調函式的變數 sum ,sum為區域性變數,儲存在棧中,經過主函式sleep(1)之後,系統會回收其他函式的棧空間,也就是fun1裡面的棧空間,被釋放掉了。
2.若防止sum被釋放的,可以加上static 如 static int sum=0,因為static 是儲存在資料段裡面,(區域性變數/引數/返回地址均儲存在棧中,全域性變數/常量/靜態變數則儲存在資料段中),所以棧被釋放掉了,數段段依然存在(生命週期,伴隨整個檔案)。