所以我寫了一個玩具C程序,將故意導致堆棧溢出,正好與我的系統的限制周圍玩:爲什麼這個堆棧溢出這麼快?
#include <stdio.h>
int kefladhen(int i) {
int j = i + 1;
printf("j is %d\n",j);
kefladhen(j);
}
int main() {
printf("Hello!:D\n");
kefladhen(0);
}
我很驚訝地發現,分段錯誤之前打印的最後一行是「j是174651」。當然,每次運行它的確切數量都會有所變化,但總的來說,我驚訝地發現,17.4萬個堆棧幀足以耗盡我的4GB linux筆記本電腦上的進程的內存。我認爲printf可能會產生一些開銷,但是在遞歸調用kefladhen()之前printf會返回,所以堆棧指針應該回到之前的位置。我每次調用只存儲一個int,所以每個堆棧幀總共只有8個字節,對嗎?因此,其中有一萬七千多個實際使用的內存只有大約一兆字節和一半,這對我來說似乎很低。我在這裏誤解了什麼?
您的默認堆棧大小有多大?它通常介於1MB和2MB之間... –
請注意,堆棧不僅存儲本地變量。例如,返回地址。 – delnan
在bash提示符處嘗試'ulimit -a'(或'ulimit -s'來獲取堆棧大小)。你也可以用'sizeof(int)'來驗證你的整數的大小。 – pmg