C語言被呼叫函式裡棧區分配的記憶體,主呼叫函式是不能使用的

2021-04-18 11:51:48 字數 1131 閱讀 5801

1樓:巴伐利亞巨人

fun2.首先字串「char*p表示被調函式在棧區分配乙個位元組的記憶體,p中的內容是常量區字串專「abcde」的首位址,屬函式二呼叫結束時棧區被**,而p作為返回值儲存下來,常量區的「abcde」也沒有受到影響,所以可以在主函式中使用。

fun3.中char str的含義是被調函式在棧區分配6個位元組記憶體,然後把常量區的「abcde」拷貝到棧區分配的記憶體中,此時的str指向的是棧區中的「abcde」的首位址,而不是常量區中「abcde」的首位址,所以在呼叫結束時(當在主函式中呼叫其他函式時意味著前乙個呼叫的函式棧區**vs2013),str作為返回值被儲存下來,而str所指向的記憶體空間已經被**掉了。此時在主函式中用str[i]就不可能輸出得到想要的結果了。

這也正是陣列名指標與普通指標的乙個區別。(還有乙個區別就是陣列名指標是常量指標不能改變指向)

2樓:匿名使用者

我是這麼理解的,函式呼叫返回值也會根據型別分配一段記憶體空間,fun1的返回值型別是專int型,程式會分配4個字屬節用於儲存int型的返回值,而a是個整形,它的值在記憶體釋放前賦值拷貝給了返回區空間。

fun2和fun3的返回值型別是char *,程式會分配4個位元組的記憶體空間儲存返回值,這個值儲存的是乙個位址,而 p = 「abcde」指向的是常量區,在函式呼叫結束前將p指向的位址(假如是0x00000111)拷貝給了返回值區間,函式呼叫結束後雖然釋放了區域性變數p所佔的空間,但函式返回值空間儲存的是拷貝過來的位址(依然是0x00000111),而這個位址所指向的記憶體區並沒有釋放,所有p可以看到指向的是"abcde"

而fun3拷貝的是區域性變數str所儲存的位址(假如是0x00002222),函式呼叫結束時會釋放區域性變數str的分配的記憶體,這個時候0x00002222所指向的內容就不確定了,因為它被**了...所有如果呼叫fun3,它的返回值是不確定的

3樓:匿名使用者

非指標和位址操作的函式引數和返值,都是賦值操作,而不是位址操作。

fun1出來後,變數a是無效了,但返值相當於乙個被a賦值的臨時變數,而不是返回了a的位址。

4樓:我透明_的

a是常量 你ruturn str是指標位址 而這個位址在跳出這個函式時就已經被free了 區域性變數只能在函式裡使用

求教C語言的函式的遞迴呼叫,c語言函式遞迴呼叫看不懂了,求教

答案是16 fit 6 呼叫函式 fit 5 fit 4 繼續呼叫 fit 4 fit 3 fit 3 fit 2 繼續呼叫 fit 3 fit 2 fit 2 fit 1 fit 2 fit 1 fit 2 呼叫fit 2 fit 1 fit 2 fit 2 fit 1 fit 2 fit 1 f...

c語言,編寫遞推函式,在用主函式呼叫求46的值

include int factorial int n int main void 編寫乙個函式,求x2 5x 4的值,x作為形參,用主函式呼叫此函式求 y1 a2 5 include include float fun float x void main 執行示例 c語言程式設計 編寫函式用以求表...

在呼叫函式時,函式是怎樣傳值的,c語言函式呼叫時,實參和形參是如何傳遞的?什麼時候要寫指標型變數?求高手指點

毋惜苼 在c語言中,實參將值傳給函式中的形參,實現了自上而下的值傳遞,就可以呼叫函式了。舉個淺顯一點的例子吧 include void main int swap int x,int y 在主函式中,將實參a,b的值傳遞給被呼叫函式中的形參x,y,即將a,b分別代入x,y中計算,即達到了呼叫的目的。...