首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈内存有限制吗?

堆栈内存有限制吗?
EN

Stack Overflow用户
提问于 2010-05-06 17:48:03
回答 6查看 10.4K关注 0票数 11

我正在穿过其中的一根线。程序崩溃,因为它在函数中本地声明了一个10^6的数组。

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

当相同的数组被全局声明时,它工作得很好(堆上的内存保存了它)。

现在,让我们假设,堆栈向下增长,堆栈向上增长。

我们有:

-堆栈

-堆

现在,我相信如果在堆栈上分配失败,它一定也会在堆上失败。

所以我的问题是:堆栈大小有限制吗?(超过限制会导致程序崩溃)。还是我错过了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-06 17:56:18

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

票数 5
EN

Stack Overflow用户

发布于 2010-05-06 18:18:36

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

通常,对于当前的语言,默认值(如果不是手动设置)大约是1MB,这已经足够了,除非你做了一些通常不推荐做的事情(比如在堆栈上分配巨大的数组)

票数 7
EN

Stack Overflow用户

发布于 2016-03-16 06:26:27

到目前为止,与所有答案相反,在带有GCC的Linux上(我猜对于所有现代POSIX操作系统都是如此),最大堆栈大小是操作系统强制执行的安全限制,可以很容易地解除。

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

代码语言:javascript
复制
#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();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2780100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档