2014-05-12 17 views
-1

在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,但是這似乎也沒有幫助!

+1

這不一定就是發生錯誤的地方。註釋掉這些行可能會改變導致其他代碼崩潰的原因 –

+0

10000不是一個大尺寸。顯然,這個錯誤在別的地方。這種錯誤是很正常的,可以觸發遠離原點的故障。 – ivg

+0

如何跟蹤發生錯誤的位置? –

回答

1

我的猜測:

儘管@ivg說,10000實際上是一個大尺寸。你的聲明至少需要760Mb,這很容易觸及你的硬限制,特別是在運行時增加堆棧大小(通常在函數內部調用函數時所做的事情)。

我會嘗試將該聲明移至堆內存空間(即調用malloc/free)。

0

您可能會發生堆棧溢出。通常這沒有明顯的症狀,只是奇怪的崩潰。最明顯的嘗試是讓您的大型數組成爲static,或者使用動態分配。

+0

從我們在發佈的代碼中可以看到的數組中已經有了靜態存儲持續時間。 – Lundin

+0

他說這段代碼出現在函數內部。 –

+0

我不認爲數組是在函數內部聲明還是在循環代碼片段中是不清楚的。無論如何,'static'不會解決問題,只需將它移動到別處。動態分配是唯一正確的解決方案。 – Lundin

1

如果這些數組聲明在文件範圍內,則它們具有靜態存儲持續時間並存儲在.bss段中。

如果這些數組是在本地作用域聲明的,則它們存儲在堆棧中。

在任何一種情況下,您都使用的極限內存量極可能超過了給定系統上的最大極限.bss或堆棧。

假設sizeof(double) == 8sizeof(int) == 4,那麼你已經分配

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

的空間大約780MB。

像這樣的大量內存應該分配在堆上。