1. 程式人生 > >C指針函數中的局部變量返回

C指針函數中的局部變量返回

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=&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 是存儲在數據段裏面,(局部變量/參數/返回地址均存儲在棧中,全局變量/常量/靜態變量則存儲在數據段中),所以棧被釋放掉了,數段段依然存在(生命周期,伴隨整個文件)。

C指針函數中的局部變量返回