分段故障:核心在初始化大型数组时进行转储

时间:2014-05-12 11:34:37

标签: c arrays fault

在linux上,使用gcc作为编译器,我得到了臭名昭着的核心转储错误。 全球声明:

#define MAX_N 10000  


double cost[MAX_N][MAX_N]={0};
int stack[MAX_N];
int visited[MAX_N];

错误发生的地方(一旦我注释掉这些行就消失了):

for(q=0;q<5;++q) 
    {
        visited[q]=0;
        stack[q]=0;
    }

这段代码位于一个被称为10,000+次的函数内。因此,每次调用该函数时,都需要进行此初始化!我尝试过使用memset,但这似乎也无济于事!

3 个答案:

答案 0 :(得分:1)

我的猜测:

尽管@ivg说,10000实际上是一个大尺寸。您的声明至少需要760Mb,这很容易触及硬限制,特别是在运行时增加堆栈大小时(通常在调用函数内部函数时执行的操作)。

我会尝试将该声明移动到堆内存空间(即调用malloc / free)。

答案 1 :(得分:1)

如果这些数组在文件范围内声明,则它们具有静态存储持续时间并存储在.bss段中。

如果这些数组在本地范围内声明,则它们存储在堆栈中。

在任何一种情况下,您使用的是极大量的内存,这很可能超过了给定系统上.bss或堆栈的最大限制。

假设sizeof(double) == 8sizeof(int) == 4,您已分配

(8 * 10000 * 10000) + (4 * 10000) + (4 * 10000) = 800,080,000 bytes

大约780Mb的空间。

应该在堆上分配大量这样的内存。

答案 2 :(得分:0)

您可能有堆栈溢出。通常这没有明显的症状,只是奇怪的崩溃。最明显的尝试是使大型数组为static,或者使用动态分配。