堆栈内存是否有限制?

我正在通过其中一个主题。 程序崩溃是因为它在一个函数内部本地声明了一个10 ^ 6的数组。

给出的原因是堆栈上的内存分配失败导致崩溃。

当全局声明相同的数组时,它运行良好(堆上的内存保存了它)。

现在,我们假设,堆栈向下堆积并向上堆积。

我们有:

--- STACK ---

-------------------

- -堆 - -

现在,我相信如果在堆栈上分配失败,它也必须在堆上失败。

所以我的问题是:堆栈大小是否有限制? (越过限制导致程序崩溃)。 或者我错过了什么?


这完全取决于你使用的语言和编译器。 但是用例如C或C ++编译的程序在程序启动时分配一个固定大小的堆栈。 通常可以在编译时指定堆栈的大小(在我的特定编译器中它默认为1 MB)。


是的,堆栈总是有限的。 在几种语言/编译器中,您可以设置所需的大小。

通常,当前语言的缺省值(如果没有手动设置)大约为1MB,除非您执行通常不推荐的操作(就像您在堆栈上分配巨大数组)


与迄今为止所有答案相反,在Linux上使用GCC(我想对所有现代POSIX操作系统来说都是如此),最大堆栈大小是操作系统执行的安全限制,可轻松解除。

我制作了一个小程序,递归调用一个函数,直到堆栈中至少分配10 GB,等待终端输入,然后从所有递归调用安全地返回到main

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>

void grow(unsigned cur_size)
{
    if(cur_size * sizeof(int) < 10ul*1024ul*1024ul*1024ul) {
        unsigned v[1000];
        v[0] = cur_size;
        for(unsigned i = 1; i < 1000; ++i) {
            v[i] = v[i-1] + 1;
        }

        grow(cur_size + 1000);

        for(unsigned i = 0; i < 1000; ++i) {
            if(v[i] != cur_size + i)
                puts("Error!");
        }
    } else {
        putchar('#');
        getchar();
    }
}

int main()
{
    struct rlimit l;
    l.rlim_max = RLIM_INFINITY;
    l.rlim_cur = RLIM_INFINITY;
    setrlimit(RLIMIT_STACK, &l);

    grow(0);
    putchar('#');
    getchar();
}
链接地址: http://www.djcxy.com/p/79829.html

上一篇: Is there any limit on stack memory?

下一篇: Programmatically retrieve peak virtual memory of a process