在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,但这似乎也无济于事!
答案 0 :(得分:1)
我的猜测:
尽管@ivg说,10000实际上是一个大尺寸。您的声明至少需要760Mb,这很容易触及硬限制,特别是在运行时增加堆栈大小时(通常在调用函数内部函数时执行的操作)。
我会尝试将该声明移动到堆内存空间(即调用malloc / free)。
答案 1 :(得分:1)
如果这些数组在文件范围内声明,则它们具有静态存储持续时间并存储在.bss
段中。
如果这些数组在本地范围内声明,则它们存储在堆栈中。
在任何一种情况下,您使用的是极大量的内存,这很可能超过了给定系统上.bss
或堆栈的最大限制。
假设sizeof(double) == 8
和sizeof(int) == 4
,您已分配
(8 * 10000 * 10000) + (4 * 10000) + (4 * 10000) = 800,080,000 bytes
大约780Mb的空间。
应该在堆上分配大量这样的内存。
答案 2 :(得分:0)
您可能有堆栈溢出。通常这没有明显的症状,只是奇怪的崩溃。最明显的尝试是使大型数组为static
,或者使用动态分配。