1. 程式人生 > >C指標函式中的區域性變數返回

C指標函式中的區域性變數返回

所謂指標函式其實就是  :一個函式的返回值為指標

  指標函式定義:返回型別識別符號*  函式名(形參列表){函式體}  

          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=&sum; 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 是儲存在資料段裡面,(區域性變數/引數/返回地址均儲存在棧中,全域性變數/常量/靜態變數則儲存在資料段中),所以棧被釋放掉了,數段段依然存在(生命週期,伴隨整個檔案)。