为什么这个堆栈溢出得这么快?

Tne*_*ppa 1 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);
}
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现在分段错误之前打印的最后一行是"j是174651".当然,每次运行时它的确切数量都会有所变化,但总的来说,令我惊讶的是,在我的4GB linux笔记本电脑上进行处理耗尽了17,000多个堆栈帧就足以耗尽内存.我认为也许printf会产生一些开销,但printf会在我以递归方式调用kefladhen()之前返回,所以堆栈指针应该回到之前的位置.我每次调用只存储一个int,所以每个堆栈帧总共应该只有8个字节,对吧?所以它们中有174,000多个只有大约一兆字节和一半的实际内存,这对我来说似乎很低.我在这里误解了什么?

T.J*_*der 8

...但总的来说,令我惊讶的是,在我的4GB linux笔记本电脑上进行了一个进程耗费了17,000多个堆栈帧就足够了......

请注意,堆栈不是常规内存池.堆栈是为了提供堆栈而预先分配的块.机器上的4GB内存可能只有1MB.我的猜测是你的堆栈大小约为1.3MB; 这对于174,651个8字节帧就足够了(返回地址为4个字节,4个字节为int).