2009-05-26 1222 views
1

我在使用Microsoft Visual Studio-2005编译器处理C代码时遇到了一个问题。编译错误:无法分配一个常量大小为0的数组。为什么我得到这个?

我试图静态地宣布一个大的缓冲区为:

int gbl_data[4096*4096*256]; 

编辑:这个宣言是在头文件中的全局变量。

这是给编译错误说 - “不能分配一个恒定大小的数组0”。

意思是4096X4096X256的尺寸比MAX_INT_LIMIT尺寸(2^31)大得多,可能会环绕并变成-ve左右。但是,它应该给出“负下标”的错误。

我试着将常量铸造为4096UL x 4096UL x 256UL,仍然是编译错误。

这个错误的原因是什么?

是因为物理内存大小不足以分配这个大尺寸缓冲区或什么?

它是什么修复?

谢谢你。

-GM。

+0

gbl_data的一个实例的大小是多少? – sharptooth 2009-05-26 11:55:30

+0

它是一个整数数组。 gbl_data只是数组名称:) – jalf 2009-05-26 12:00:30

回答

9

数组大小不是int,它是一个unsigned int。一个unsigned int有一个4294967295最大值你有最后一次,因此它绕回到0

铸造常量,多头不会改变任何东西,因为多头的在大多数32位整数平台。

您可以尝试用很长的时间,但现在我们遇到了另一个小问题。

您试图分配40亿个整数。 32位CPU具有40亿的存储空间字节。您试图分配可能存在的最大理论内存量的4倍。 (16GB)

所以回到绘图板。找出你为什么试图做到这一点,以及你可以做什么。

0

您试图静态分配2^32(或32位系统上的地址空间的4倍)数组。编译器似乎截断了4096 * 4096 * 256(这是我的头顶,0x10000)到一个32位值。

根据您的平台,无符号long可能也是32位,也是截断。

我建议你确保你正在编译64位平台(如果这就是你想要的),或者改变算法来动态分配内存(显然不会超过地址空间),或者锅与磁盘上的文件。

相关问题