變數的儲存位址分配和函式返回區域性變數相關問題

2021-08-21 19:43:20 字數 1754 閱讀 1698

當乙個函式執行完後,內部的區域性變數會被銷毀,因此,在返回函式值時,不要返回區域性變數,否則會出現不知名的錯誤。但是,有的時候又是可以返回區域性變數的,這又是為什麼呢?

來看一下這個例子:

假如定義了乙個如下的結構:

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 ...