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