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

gol*_*ean 1 c compiler-errors visual-studio-2005

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

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

int gbl_data[4096*4096*256]; 
Run Code Online (Sandbox Code Playgroud)

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

它给出了一个编译错误说 - " 无法分配一个常量大小为0的数组 ".

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

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

这个错误的原因是什么?

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

有什么办法解决的?

谢谢.

-GM.

jal*_*alf 9

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

将常量转换为long并不会改变任何东西,因为longs 在大多数平台上也是 32位整数.

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

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

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