C指針函數中的局部變量返回
阿新 • • 發佈:2018-11-07
fun 詳細 size 函數名 dev nis tro window系統 lee
所謂指針函數其實就是 :一個函數的返回值為指針。
指針函數定義:返回類型標識符* 函數名(形參列表){函數體}
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 是存儲在數據段裏面,(局部變量/參數/返回地址均存儲在棧中,全局變量/常量/靜態變量則存儲在數據段中),所以棧被釋放掉了,數段段依然存在(生命周期,伴隨整個文件)。
C指針函數中的局部變量返回