2011-05-08 146 views
2

此代碼是給我段錯誤:C++數組聲明問題

#include <stdio.h> 

int main(int argc,char** argv[]){ 

int ar[20000000]; 

return 0; 

} 

但是,如果我通過0減少數組的大小 - 那麼它的罰款。我超過了最大尺寸?如果我想存儲整數量呢?謝謝。

回答

6

這可能與您試圖在堆棧上分配超過70兆字節的數據有關。 Windows具有每個線程IIRC的默認堆棧大小爲1兆字節。嘗試用new的空閒存儲分配它,就像這樣:

int* ar = new int[20000000]; 

,並使用它時,你就大功告成了,delete[]它:

delete[] ar; 
+0

是什麼讓你認爲它是70兆字節?它並不是說在C/C++標準中int是32位。 – 2011-05-09 00:19:50

1

int ar[20000000]在堆棧上聲明,採取APPX 70MB +(76.2939453MB)的內存......也許你用完了空間?

使用new在堆上分配。

+0

更喜歡80MB。 – joce 2011-05-08 21:05:39

+1

實際上76.2939453兆字節。 – 2011-05-08 21:05:58

+1

76.2939453 mebibytes(MiB),但80兆字節(MB)。 – schnaader 2011-05-08 21:11:04

3

你得到堆棧溢出:D一個真正的。

在堆上分配的存儲器,使用new

int* ar = new int[ 20000000 ]; 
// do stuff with ar 
delete[] ar; // do **not** forget about this 
1

您可能超過由堆棧幀,它是由編譯器執行的允許的大小。如果您要動態分配空間,例如:

 
int array = new int[SIZE] 

您將受到操作系統和硬件而不是您的編譯器的限制。 (這是因爲在堆上動態分配內存並將其存儲,而局部聲明的變量存儲堆棧,其中有一個嚴格的大小限制上。)