以下片段有意訪問t[4]
後面的下一個sizeof(int)字節,因此我知道在此處製作的錯誤。我只是做這個實驗來看看編譯器如何處理堆棧分配。有關堆棧分配的問題C
int t[5], i;
for (i = 0; i <= 5; i++) {
t[i] = 0;
}
當執行在Windows上的代碼,使用GNU C編譯器,程序總是陷在一個無限循環的移植版本。我確信這隻會發生,因爲t
和i
被依次分配到堆棧上,並且t[5]
指向與i
變量相同的地址。因此,在執行t[5] = 0
時,程序實際上將i
的值設置爲零。
但是,當使用不同版本的GNU C編譯器進行編譯時,我從來沒有得到無限循環。地址t[5]
與地址i
不一樣。
我的問題是,爲什麼這種不同的行爲?我知道你不應該假設任何關於這個結果的事情,但是不應該以相同的方式發生堆棧分配嗎?
我真正好奇的是編譯器如何管理這些堆棧分配。有沒有填充?訂單是否與源代碼一樣?顯然,這與C標準無關,實現之間或者甚至是同一編譯器的不同版本之間存在差異。我很好奇,在這個特殊情況下可能的結果和考慮是什麼。
'C'和'C++'有區別。請不要用這兩個標記問題。 –
「我認爲堆棧分配應該以相同的方式進行。」 - 你爲什麼這麼想?這完全是一個實現細節,不以任何方式由語言定義。 – BoBTFish
爲什麼你認爲無限循環的原因是修改'i'的任務?編譯器知道'i <= 5'永遠不可能是真實的並且優化比較。 –