2010-09-01 75 views
1

我正在編寫一個C程序。在第一行,我有增加數組大小時出現分段錯誤

typedef float m_elem[NMAX][NMAX][3]; 
m_elem asa_m; 
m_elem asa_mi[100]; 

然後,一些計算。目前,對於每次運行並取決於輸入,我將代碼更改爲NMAX值,然後重新編譯並運行它。對於低於500的NMAX值,程序運行正常,但對於更高的NMAX值(我需要某些輸入文件),我得到的是分段錯誤。

你有什麼建議我在這裏做什麼?我讀到的valgrind學習,但在這種情況下,我不知道如果只是改變編譯選項某種程度上允許處理更大的矩陣的方案將幫助

感謝

+0

可能的重複http://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array – 2010-09-01 13:07:38

回答

6

你可能運行的堆棧空間。

在NMAX = 500時,asa_mi變量將需要500 * 500 * 3 * 100 * 4個字節或約300 MB。大多數操作系統不會允許一個很大的堆棧,所以你可能想檢查你的系統的限制。

你嘗試從堆中分配的,與malloc()呢?

+2

靜態分配是另一種選擇。 – 2010-09-01 11:56:01

1

我的猜測是,你用完堆棧內存。 我建議用大量的數據

0

像其他的處理都表示這可能是一個堆棧問題時動態分配內存。如果array是某個函數的局部變量,那麼情況可能如此。這會失敗,因爲CPU從堆棧指針中索引的能力有限,或者堆棧分配的失敗方式與無限遞歸引發的堆棧溢出相似。後者會導致分段錯誤,因爲系統在你已經定義的堆棧空間上有一個上限,或者因爲某些原因它會自動拒絕爲它分配。這可能在不同的操作系統上有所不同如果CPU的堆棧索引不僅僅是有限而是中斷,則前者只會導致分段錯誤,導致STACKPOINTER偏移量產生錯誤的地址;我不知道有任何CPU有這個問題,但它是可能的。考慮使用靜態,全局或動態(malloc)數組,這應該避免這個問題。

這也可能與使用不一致NMAX常數的問題。你可能已經讓NMAX的一些硬編碼值出現在那裏,而當你使用其他(更大的)值時,你最終會超出這個值。

同樣的,你可能只是有一個數組索引溢出,只有引起分段錯誤,如果當n最大/大。由於NMAX被用作m_elem陣列的二維尺寸,它的增長相對於NMAX是指數型的。對於較小的NMAX值,它可以全部駐留在一個內存頁面中,並且由於OS通常通過頁面跟上程序的內存,溢出可能不會導致分段錯誤。隨着NMAX變得更大,它可能需要更多的內存頁面來容納它。隨着數組的增長(按指數規律),索引超出邊界錯誤的機會將擴展到內存頁面中,該頁面不包含數組的任何部分,並且可能根本不是程序的一部分(或者至少不是可寫部分)。如果將3D陣列想象成高度爲3,長度爲NMAX,寬度爲NMAX的城堡牆,並且該城堡的一面牆很弱並且容易被破壞,那麼每次增加NMAX時,您都會將所有牆更長,包括那個有缺陷的牆,所以你的城堡裏有更多錯誤的牆。

+0

感謝您的詳細和有見地的答案 – flow 2010-09-02 11:19:32