c - 为什么这个堆栈溢出这么快?

标签 c memory

所以我写了一个玩具 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/

相关文章:

c - 如何在不使用递归的情况下将链表复制到另一个列表

c - 错误 : expected ‘=’ , ‘,’、 ‘;’、 ‘asm’ 或 ‘__attribute__’ token 之前的 ‘{’

c - SPI 闪存编程问题

android - 服务分配大量内存?

iphone - NSDictionary 的字节大小

c++ - 增加进程的内存使用

c - 如何在V4L2中正确设置扩展控件?

c - if 语句在表达式中具有等号 "="而不是 "=="

java - 在 C、C++ 和 Java 中提升/重新排序 : Must variable declarations always be on top in a context?

memory - Redis 最佳哈希集条目大小