所以我写了一个玩具 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 is 174651”。当然,每次运行它的确切数字都会有所不同,但总的来说,我很惊讶 174 万奇数的堆栈帧足以耗尽我的 4GB linux 笔记本电脑上的进程的内存。我认为 printf 可能会产生一些开销,但是 printf 在我递归调用 kefladhen() 之前返回,因此堆栈指针应该回到以前的位置。我每次调用只存储一个 int,所以每个堆栈帧总共应该只有 8 个字节,对吧?因此,其中 17.4 万个只是实际使用的内存的大约 1 兆字节半,这对我来说似乎太低了。我在这里有什么误解?