在使用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。
答案 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位平台(如果这是您想要的),或者将算法更改为动态分配内存(显然不超过地址空间),或者炒锅与磁盘上的文件。