2009-08-11 70 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或其朋友分配数组是最好的选择。 (如果你必须走这条路线,全球创建也是可行的。)