2009-08-11 67 views
2

我想聲明一個數組: int a [256] [256] [256] 程序掛起。 (我已經註釋掉所有其他代碼...) 當我嘗試int [256] [256]時,它運行正常。C++中的多維數組掛起

我正在使用MingW C++編譯器Eclipse CDT。

我的代碼是: int main(){ int a [256] [256] [256]; return 0; }

歡迎任何評論。

+0

你是什麼意思「註釋掉所有其他代碼」?你的意思是說,一個由單行'int a [256] [256] [256]'和空主方法'int main(){}'組成的程序掛起? – 2009-08-11 22:21:32

+0

歡迎使用實際的代碼。 – Alex 2009-08-11 22:21:51

+5

256 * 256 * 256是1600萬個元素;您的陣列在32位系統上是64兆字節。對於現代系統來說不是不合理的,但是如果你在堆棧上(在函數內部)分配,它可能比你的編譯器和操作系統期望的要大。 – 2009-08-11 22:26:15

回答

10

這可能會發生,如果你的數組本地功能。在這種情況下,你需要一個足夠容納2^24個整數(2^26個字節或64 MB)的堆棧大小。

如果你讓這個數組成爲全局數組,它應該可以工作。我不確定如何在Windows中修改堆棧大小;在Linux中,你會使用「ulimit -s 10000」(單位是KB)。

如果您有充分的理由不使用全局(併發或遞歸),您可以使用malloc/free。重要的是要麼增加你的堆棧(如果你使用線程不是一個好主意),或者獲得堆(malloc/free)或靜態數據段(全局)上的數據。

理想情況下,你會得到程序終止(核心轉儲)而不是掛起。我在cygwin做。

+0

+1,打我吧!如果這確實是問題,那麼使用malloc或new []從堆中分配內存也可以解決問題。 – 2009-08-11 22:30:23

+0

嘗試從堆棧中吃掉64MB很可能是一個問題,確實是+1。 – 2009-08-11 22:31:26

0

也許你沒有16MB的自由連續內存?很難想象,但可能...

+0

@bkritzer:64MB;整數是4個字節。 8-) – RichieHindle 2009-08-11 22:26:42

+0

哎呀,沒有注意到「int」部分。 – bkritzer 2009-08-11 22:29:42

0

你想是這樣的

#include <malloc.h> 
int main() 
{ 
    int *a; 
    a = (int*)malloc(256*256*256*sizeof(int)); // allocate array space in heap 
    return 0; 
} 

否則,你得到的東西是這樣的:

alt text http://bweaver.net/files/stackoverflow1.jpg

因爲,正如其他人所指出的,在你的代碼你分配的數組在堆疊上,然後吹起來。

通過malloc或其朋友分配數組是最好的選擇。 (如果你必須走這條路線,全球創建也是可行的。)