2009-12-04 58 views
79

以下代碼在2Gb計算機上運行時給出了分段錯誤,但適用於4GB機器。大型陣列大小上的分段錯誤

int main() 
{ 
    int c[1000000]; 
    cout << "done\n"; 
    return 0; 
} 

該陣列的大小隻是4Mb。在C++中可以使用的數組大小是否有限制?

回答

93

你可能只是在這裏得到一個堆棧溢出。該數組太大而不適合您程序的堆棧地址空間。

如果你在堆上分配數組,你應該沒問題,假設你的機器有足夠的內存。

int* array = new int[1000000];

但請記住,這將需要你delete[]數組。更好的解決方案是使用std::vector<int>並將其大小調整爲1000000個元素。

+0

感謝您的答案,但你能解釋爲什麼數組分配在堆棧上,爲什麼不在主程序存儲器。 – Mayank 2009-12-04 15:51:32

+9

給定的代碼在堆棧上分配,因爲它在編譯時被指定爲具有常數元素的數組。只有malloc,new等纔會將值放在堆上。 – 2009-12-04 16:05:43

+3

所有自動變量都在堆棧中分配。如果你看看反彙編,你會看到從堆棧指針中減去局部變量的大小。當你調用malloc或calloc或任何內存函數時,函數會發現足夠大的內存塊以滿足你的請求。 – rerun 2009-12-04 16:12:01

2

在這種情況下,您正在爲堆棧分配數組,嘗試使用alloc分配相同大小的數組。

46

在C或C++本地對象通常分配在堆棧上。你正在堆棧上分配一個大的數組,超過堆棧可以處理,所以你得到一個stackoverflow.

不要在堆棧上本地分配它,而是使用其他地方。這可以通過使對象全局或在全局上分配來實現。全局變量很好,如果你不使用任何其他編譯單元。爲了確保這不會偶然發生,請添加一個靜態存儲說明符,否則只需使用堆。

這將在BSS段,這是堆的一部分分配:

static int c[1000000]; 
int main() 
{ 
    cout << "done\n"; 
    return 0; 
} 

這將在數據段,這是堆的一部分太分配:

int c[1000000] = {}; 
int main() 
{ 
    cout << "done\n"; 
    return 0; 
} 

這會在某個不確定的位置在堆中分配:

int main() 
{ 
    int* c = new int[1000000]; 
    cout << "done\n"; 
    return 0; 
} 
+0

如果你使用第三種模式,在堆上分配,不要忘記在某個階段刪除[]指針,否則你會泄漏內存。或者研究智能指針。 – meowsqueak 2012-09-05 01:20:23

+6

@meowsqueak當然,最好的做法是在你用'new'分配的任何地方刪除''。但是如果你確定只分配一次內存(就像在主內存中那樣),那麼這是絕對不需要的 - 即使沒有明確的「delete」,內存也能保證在主內存中被釋放。 – hirschhornsalz 2012-09-05 08:11:49

+0

'at'drhirsch(你怎麼做一個人物?) - 是的,公平的評論。由於OP對於該語言而言似乎是新手,我只是想確保他們和其他任何看到您的良好答案的人都知道,如果一般情況下使用了第三種方法的含義。 – meowsqueak 2012-09-05 12:19:44

2

因爲你的陣列存儲在STA CK。你應該把它存儲在堆中。請參閱this link以瞭解堆和堆棧的概念。

6

另外,如果你在大多數UNIX & Linux系統上運行,就可以暫時用下面的命令增加堆棧大小:

ulimit -s unlimited 

但要小心,內存是一種有限的資源,並以極大的力量來偉大責任:)

+0

這是解決方案,但我建議所有人在刪除該程序堆棧大小的默認限制時非常謹慎。您不僅會遇到嚴重的性能下降,而且您的系統可能會崩潰。例如,我嘗試在4GB內存的機器上用帶有快速排序的16 000 000個整數元素排序數組,並且我的系統幾乎被殺死。 LOL – rbaleksandar 2014-10-16 16:51:55

+0

@rbaleksandar我認爲你~16MB的程序幾乎殺死你的機器,因爲你正在處理幾個數組副本(可能每個函數調用一個?)嘗試更多的內存感知實現;) – RSFalcon7 2014-10-16 23:20:17

+0

我很確定數組處理沒關係,因爲我是通過引用而不是按價值傳遞的。 bubblesort也會發生同樣的情況。地獄,即使我的quicksort實施吸泡沫是你不可能錯誤地實現的東西。大聲笑 – rbaleksandar 2014-10-17 10:07:47