當乙個函式執行完後,內部的區域性變數會被銷毀,因此,在返回函式值時,不要返回區域性變數,否則會出現不知名的錯誤。但是,有的時候又是可以返回區域性變數的,這又是為什麼呢?
來看一下這個例子:
假如定義了乙個如下的結構:
struct list;
定義乙個函式:
struct list make1(int x, int y)
使用如下語句進行賦值:
int *p = make(1,2);
執行結果如圖:
結果正確!!! 不是說不能返回區域性變數嗎?為什麼這裡能得到正確的結果呢?
仔細分析,我們發現,雖然函式make1裡的temp是區域性變數,將隨著make1的結束而撤銷,但是在make1結束時,temp裡面的資料已經作為函式值返回了,與temp的撤銷無關。因此,如果只是返回值的話,即使返回區域性變數,那麼最終還是會將正確的值傳到相應的變數。再看下面乙個例子:
char *func()
char *p;
p = func();
printf("%s", p);
執行結果:
輸出的與a陣列中的字串完全不一樣!!! 因為陣列作為區域性變數,當函式結束後,陣列便被銷毀。
int *func()
int *p;
p = func();
printf("%d\n", *p);
執行結果是
!!!仍然是2 !!!不是說內部變數會被銷毀嗎?為什麼p指向位址儲存的值還是2!!!
原來編譯器在函式執行結束後,的確會對區域性變數進行銷毀,但是需要一定的時間。例如以下**:
最終,執行的結果是:
結果正確。
下面再看乙個例子:
struct list *make2(int x, int y)
struct list *p = make2(1,2);
printf("\n變?量?外猘部?地?址·:阰%ox\n", p);
printf("變?量?在ú內ú部?地?址·的?值μ:阰%d %d\n",*(&p->a),*(&(p->b)));
printf("%d %d\n", p->a, p->b);
執行結果為:
在函式裡面定義了區域性指標,但最終的值還是不變!!!這又是為什麼呢?
原來,有malloc申請的記憶體是存放在堆中,因此,在函式結束後並不會被銷毀!!!
現在複習一下c語言中變數的儲存位址分配。
儲存區可以分為:
**區:用來存放程式的二進位制**
文字常量區:存放字串常量
全域性區(靜態區):用來存放全域性變數和靜態變數
堆:一般由程式設計師分配和釋放。
棧:編譯器自動分配和釋放,存放函式的引數,區域性變數等。
返回區域性變數或臨時變數的位址 變數的儲存型別
按照變數的作用域 即從空間 角度分 可以分為全域性變數和區域性變數。按照變數的生存期 即從時間 角度分 可以分為靜態儲存方式和動態儲存方式。靜態儲存方式 是指在程式執行期間分配固定的儲存空間的方式。動態儲存方式 是在程式執行期間根據按需分配進行動態的分配儲存空間方式。使用者儲存空間可以分為程式區 靜...
函式的變數和返回值
一 函式的變數 1.函式變數分為區域性變數和全域性變數 區域性變數 在python中的任何變數都有特定的作用域,在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數 全域性變數 在乙個檔案頂部定義的變數可以供檔案中的任何函式呼叫,這些可以為整個程式所使用...
C語言函式不能返回區域性變數的位址
在c中,正常情況下,我們只能從函式中返回乙個值。但在很多情況下,我們需要從函式中返回多個值,此時使用陣列或指標能夠很好地完成這樣的任務。這裡是乙個示例。這個程式使用乙個整型陣列作為引數,並將陣列元素的和與積返回給呼叫函式。下面是c 這是一種常見情況。下面給出實現技巧 include stdio.h ...