關於返回區域性變數的記憶體

2021-07-12 05:31:20 字數 600 閱讀 4522

在c語言中,自動變數在堆疊中分配記憶體,當包含自動變數的函式或**塊退出時,它們所占用的記憶體便會被**,為了能夠在包含自動變數的函式或**塊退出時,仍然能夠訪問這些自動變數的記憶體,可以如下幾種方案:

1)返回乙個指向字串常量的指標。如

char *func()

僅適用於簡單的情形。

2)使用全域性宣告的陣列

這種方法是最簡單的,但是缺點也是顯而易見,因為任何人都有可能修改這個陣列內容。

3)使用靜態陣列。

char *func()

這樣做的缺點是該函式下一次呼叫時會覆蓋這個陣列的內容,所以呼叫者必須備份陣列裡的內容。

4)顯示分配記憶體,儲存返回的值

char *func()

這樣做的缺點是,呼叫者很容易忘記釋放記憶體,從而造成記憶體洩露。

好了,言歸正傳。inet_ntoa函式的輸入引數是u_int型的ip位址,返回的卻是指向ip字串的指標,很明顯,ip字串所佔的記憶體是在函式內部分配的,而我們並不需要釋放該記憶體,所以,它分配的記憶體是靜態的,也就是說下一次呼叫該函式時會覆蓋這個陣列的內容,所以就會出現上述的結果(printf裡面的可變引數的求值是從右到左的)。為了解決這個問題,我們只需備份陣列裡的內容即可。

函式返回區域性變數

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

函式返回區域性變數

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

函式返回區域性變數

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