太大的嵌套数组导致分段错误(核心转储)

时间:2016-12-05 18:54:12

标签: c arrays segmentation-fault

我遇到问题,我需要做一些大数据处理并创建太大的数组似乎导致Segmentation fault (core dumped)。以下是问题的复制:

int main() {
struct { char a[2000][12] } b[2000];
return 0; }

我使用Archlinux 64位,cc作为编译器,ulimit -s返回8192这很奇怪,因为我有24GB的RAM。知道如何解决这个问题吗?我认为这与stackheap有关,但我不知道它们是什么。

3 个答案:

答案 0 :(得分:1)

基本上,您尝试在堆栈上分配2000 * 12 * 2000/1024 = 46875 KB,但仅允许使用8192 KB。快速解决方法是设置Array ( [0] => Array ( [0] => myTemplate, [1] => testArr => [1868,1869,1870], [2] => testInteger => 3, [3] => testString => 'test, can contain a comma' ) )

简而言之,ulimit -s 50000stack:stack是每个函数调用的私有内存(函数变量的内容所在的位置,即标量值,地址等) ,heap是一个公共内存,通常没有那么严格的限制(参见例如heap)。

答案 1 :(得分:1)

ulimit -s

不返回总RAM大小。它只返回当前shell具有的可用堆栈大小(以及它可以创建的所有进程)。因此,可用的RAM大小并不重要。

您可以使用ulimit -s unlimited增加它。但是我建议对这样的大型阵列使用动态内存分配,而不是你的阵列大小约为48MB,如果在堆栈上不可用,你很容易遇到麻烦,主要是因为"堆栈分配&# 34;失败很难被发现。

答案 2 :(得分:1)

通过使用局部变量声明数组来使用堆栈内存。使用堆内存分配:

typedef struct {
    char a[2000][12];
} bigArray;

int main(void) {
    bigArray *array;
    array = (bigArray*)malloc(2000 * sizeof(bigArray));

    // Do stuff with array here

    free(array);
    return 0;
}