C語言中返回區域性變數或臨時變數的位址的錯誤

2021-07-03 15:41:50 字數 549 閱讀 6936

先看如下**, 在編譯執行的時候會丟擲警告——-warning c4172: 返回區域性變數或臨時變數的位址,並且在main函式中的列印結果不符合我們的預期

**如下:

int* visitarea()

int main()

列印結果:

10

-2-2

請按任意鍵繼續. . .

我們通過上面可以發現main函式呼叫visitarea ,返回visitarea中的區域性變數的位址,然後賦值給main函式中的變數進行列印, 第乙個printf語句列印出了符合我們預期的結果,但是接下來的兩個語句列印的結果不符合我們的預期, 這是為什麼呢?

在c語言中,區域性變數是分配在棧空間上的, 當函式呼叫結束後,他由編譯器釋放. 我們通過呼叫visitarea得到了他的區域性變數的記憶體位址, 然而在第二次列印的時候他這個記憶體位址被」破壞」了, 所以出現了這個意想不到的結果.

所以我們在書寫c語言程式時候, 如果返回指標(變數位址),應該返回堆區或者全域性區的,這樣就可以避免這個」意想不到的」結果

C語言 返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

返回區域性變數或臨時變數的位址 變數的儲存型別

按照變數的作用域 即從空間 角度分 可以分為全域性變數和區域性變數。按照變數的生存期 即從時間 角度分 可以分為靜態儲存方式和動態儲存方式。靜態儲存方式 是指在程式執行期間分配固定的儲存空間的方式。動態儲存方式 是在程式執行期間根據按需分配進行動態的分配儲存空間方式。使用者儲存空間可以分為程式區 靜...

C語言中全域性變數與區域性變數

c語言中全域性變數與區域性變數的區別是什麼呢?我們怎麼定義全域性變數與區域性變數呢。一 全域性變數以下定義方法中定義的x就是被定義為了全域性變數,全域性變數可以被全域性內的函式引用。include int x 123 intmain 同時定義了全域性變數x 123後任然可以再定義乙個區域性變數x 4...