编译错误:无法分配一个常量大小为0的数组。为什么我会得到这个?

时间:2009-05-26 11:53:11

标签: c visual-studio-2005 compiler-errors

在使用Microsoft Visual Studio-2005编译器处理C代码时遇到了一个问题。

我试图静态地声明一个大缓冲区:

int gbl_data[4096*4096*256]; 

编辑:此声明是头文件中的全局变量。

它给出了编译错误 - “无法分配常量大小为0的数组”。

意味着4096X4096X256的大小太大而不是MAX_INT_LIMIT大小(2 ^ 31),并且可能会缠绕并变成-ve左右。但是它应该把错误称为“负下标”。

我尝试将常量转换为4096UL x 4096UL x 256UL,仍然是相同的编译错误。

此错误的原因是什么?

是因为物理内存大小不足以分配这个大容量缓冲区还是什么?

它的修复方法是什么?

谢谢你。

-GM。

2 个答案:

答案 0 :(得分:9)

数组大小不是int,它是unsigned int。 unsigned int的最大值为4294967295.你还有一个,所以它回绕到0。

将常量转换为long并不会改变任何内容,因为在大多数平台上long都是 32位整数。

您可以尝试使用long longs,但现在我们遇到了另一个小问题。

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

回到绘图板。弄清楚你为什么要这样做,以及你可以做些什么。

答案 1 :(得分:0)

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

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

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