2016-12-05 55 views
1

我遇到了一个问题,我需要做一些大数据处理并创建太大的数组似乎导致Segmentation fault (core dumped)。这是问题的一个复制:太大的嵌套数组导致分段错误(核心转储)

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

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

+2

这是堆栈溢出! –

+1

@KirillBulygin此网站已达到其目的,并将关闭。 – nicomp

+0

您需要从堆中分配。堆栈大小通常限制在1MB左右。阅读malloc/free。 – OldProgrammer

回答

1

基本上你试图在堆栈上分配2000 * 12 * 2000/1024 = 46875 KB,但只允许使用8192 KB。快速解决方法是设置ulimit -s 50000

总之约stackheap:堆栈是每个函数调用的专用存储器(这就是函数变量的内容驻留,即标量值,地址等),和堆是一个公共存储器与一般不太严格限制(见例如malloc(3))。

+0

什么会导致更快的程序:增加堆栈大小或做某种动态内存分配? – ChiseledAbs

+0

就速度而言,这些方法实际上是相同的,但是在堆栈上分配大内存是错误的,部分原因是在函数调用结束后偶然使用内存(并且内存内容将被其他数据损坏),也是因为你必须调用'ulimit(1)'或'ulimit(2)'来扩展堆栈的大小(并且在一些非桌面架构上也不可能有大堆栈)。 –

1
ulimit -s 

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

您可以使用ulimit -s unlimited来增加它。但是我建议使用动态内存分配来处理这样的大型数组,因为你的数组大小约为48MB,如果在堆栈上不可用,你很容易遇到麻烦,主要是因为“堆栈分配”失败难以检测。

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; 
}