看幾個例子
乙個是經典的1+2=65534:
**如下
這個&s,實際上返回了個指向區域性變數的指標,而這個變數在棧上,在函式sum呼叫完的時候,就被釋放掉了,於是這個指標是指不到想要的值3的,#include #include unsigned short *sum( unsigned char a,unsigned char b)
int main()
p=sum(a,b);
上面這個語句使p得到乙個位址,這個位址指向乙個曾經的區域性變數,這個區域性變數在函式sum()返回後就被作業系統清理掉了。
這個程式的執行結果如下:
現在我們嘗試將上面程式的
這兩句調換一下順序,再執行會發現結果變成了:printf("%u+%u",a,b);
printf("=%u\n",*p);
我們可以發現,這一次的第乙個結果是正確的,也就是1+2=3,因為這一次的printf輸出還沒有把原來棧裡面的資料覆蓋掉,而上乙個程式裡面先寫的
printf("%u+%u",a,b);
再寫printf("=%u\n",*p);
這樣第一句就把原來棧裡面的結果"3"給覆蓋掉了,所以得不出,於是我們做如下修改,把這兩句用printf("%u+%u=%u\n",a,b,*p);來代替,看看結果:
發現第一行的結果是對的,這時候我們如果將
printf("%u+%u=%u\n",a,b,*p);
printf("%u+%u=%u\n",a,b,*p);
這樣連寫兩行的話,會發現:
原理跟上面的一樣
下面我們這樣一段程式:
對於這裡的#include#includechar* check(void)
int main()
char
*p =
"abc\n"
;
這一句不是在棧裡面的,所以不會被覆蓋,可以返回值,結果如下:
區域性變數申請棧空間時的入棧順序
執行環境 ubuntu 14.04 32bit 編譯環境 gcc source code include include intmain int argc,char argv 第一組對比 在棧溢位保護機制下的編譯和沒有溢位保護機制下的編譯的入棧順序的對比 區域性變數在源 中是 char buffer...
全域性變數 區域性變數 棧 堆
一般全域性變數存放在資料區,區域性變數存放在棧區,動態變數存放在堆區,函式 放在 區。棧區是普通的棧資料結構,遵循lifo後進先出的規則,區域性變數安排在那裡是asm時就規定的,這樣可以在乙個函式結束後平衡堆疊,操作簡單,效率高 堆 動態區 在這裡應當叫堆疊 不要和資料結構中的堆搞混 是程式在編譯時...
區域性變數太大導致棧溢位
問題 昨天,有同學遇到棧溢位的問題。在做大三小學期專案時,需要乙個750x750的矩陣。於是在棧中定義了乙個二維陣列。為了說明問題,做如下簡化 測試環境 window平台 vs2013 int main 這看似沒有問題,定義了乙個變數,不大,才4.5m左右。可是,當執行時出現了棧溢位。什麼情況?編譯...