2016-04-13 39 views
-4

我使用Visual Studio 2015年,當我宣佈一個矩陣這樣當我聲明大小爲500 x 500的雙精度矩陣時,爲什麼會發生堆棧溢出?

double m[500][500]; 

我得到堆棧溢出,從main函數達到第一行代碼之前。
沒有足夠的內存嗎?該怎麼辦 ?

+1

選擇一種語言,不要同時要求C和C++。雖然兩種語言的底層問題可能都是相同的,但解決問題的正確方法絕對不是。 – hvd

+0

rep-PersonalServicesWorker飼料。 –

回答

3

因爲這樣的矩陣需要大約2MB的堆棧內存,堆棧大部分只有1MB,所以你會得到堆棧溢出。堆棧內存大小可以在您的鏈接器選項中更改(或者在創建線程時 - 至少在WinAPI - Windows下),但未在語言標準中定義。即使你設置了一個堆棧大小的例子:3MB,你永遠不知道它有多少可用 - 你的代碼執行可能在一些函數調用內部很深,這些函數調用也爲它們的變量使用堆棧內存。

解決方案是使用動態內存(堆) - 的std ::載體(C++):

// Allocates one memory buffer on heap, automatically manages memory. 
std::vector<double> m(500*500,0); 
m[499 + 499 * 500]=12; 

// Not very efficent, as it allocated 500 memory buffers for each row, 
// your memory will not be alligned what might cause cache misses 
std::vector<std::vector<double>> m2(500, std::vector<double>(500)); 
m2[499][499]=12; 

或:

double * m = (double *) malloc (500*500*sizeof(double)); 
m[x + y * 500] = 1; 
free(m); 

如果你想這款C下,它會工作也在C++下,但不鼓勵

+0

您應該強調堆棧的大小不是由語言標準(C和C++)定義的。 –

1

矩陣需要從堆中分配。對於C使用malloc,對於C++,請使用new。如果你的編譯器有一個選擇使用更大的堆棧大小,那將是一個替代方案。

+1

「矩陣需要從堆中分配」 - 不一定。這取決於堆棧的大小,如項目鏈接器設置中所定義的(對於C++和** C++這兩種語言標準都是完全不可知的)。儘管您的建議可能會解決OP的具體配置問題,但這不是一個正確的答案。 –

+0

@barakmanos - OP特別提到堆棧溢出。我的回答是迴應OP的問題。正如您所提到的,如果OP的編譯器具有該選項,則替代方法是通過編譯器選項增加堆棧大小。我更新了我的答案。 – rcgldr

相關問題