所以我写了一个玩具 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 个字节,对吗?因此,其中 174,000 只是实际使用内存的大约 1.5 兆字节,这对我来说似乎太低了。我在这里误解了什么?
最佳答案
...but in general I'm surprised that 174-thousand odd stack frames are enough to exhaust the memory for a process on my 4GB linux laptop...
请注意,堆栈不是一般的内存池。堆栈是为了提供堆栈而预先分配的 block 。它可能只是机器上 4GB 内存中的 1MB。我猜你的堆栈大小大约是 1.3MB;这对于 174,651 个八字节帧来说足够了(四个字节用于返回地址,四个字节用于 int
)。
关于c - 为什么这个堆栈溢出这么快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10382455/