區域性變數位址的返回

2021-06-26 05:33:33 字數 1674 閱讀 7875

char *fun()

這個函式的返回值?以及這個函式在棧上的儲存布局

#include #include #include char *fun()

int main(int argc, const char *argv)

就函式而言,返回區域性變數的位址這種做法是錯誤的,但是這個函式不管是在vs還是在gcc上編譯時都只會有乙個警告

區域性變數的位址在出了作用域後就沒有意義了,可能被其他資料覆蓋

➜  1009 git:(master) ✗ gcc test1.c

test1.c: 在函式『fun』中:

return ptr;

^➜ 1009 git:(master) ✗ ./a.out

test:bfe416fc bfe416fd 4

ptr a b :bfe416fc bfe416f8 bfe416f4

a1 a2 p(fun): bfe4171b bfe4171a bfe416fc

bfe41719 bfe41718

...171b                  a1

....171a                 a2

....1719                   a

.....1718                   b                       

.....分配給fun函式棧...

....16ff           ptr[3    '\0'

....16fe          ptr[2]   'a'

...16fd           ptr[1]   'd'

...16fc           ptr[0]    'f '        ---》如果字串長度加1 不為4的倍數會有記憶體對齊

....16f8           int  a

....16f4          int   b

函式退出後再定義變數,又回到171a處

可以看出大致結構,給函式分配棧時並不是直接接著上面的,雖然函式退出後沒有清空或者初始化剛剛函式占用的棧,但是後續的資料可以覆蓋上去

#include #include #include char *fun()

int main(int argc, const char *argv)

結果:

➜  1009 git:(master) ✗ gcc test1.c 

test1.c: 在函式『fun』中:

return ptr;

^➜ 1009 git:(master) ✗ ./a.out

fun :bffbedfc bffbedfd 4

ptr a b :bffbedfc bffbedf8 bffbedf4

p: 102

a1 a2 p(fun): bffbee1b bffbee1a bffbedfc

main a b :bffbee19 bffbee18

p: -33

剛退出函式時列印的是函式中的那個字元  f對應的ascii值是102,  後面定義了2個int型 就把空間覆蓋了導致輸出的是-33

函式返回區域性變數

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

函式返回區域性變數

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

函式返回區域性變數

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