1

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

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

int gbl_data[4096*4096*256]; 

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

它给出了一个编译错误——“<strong>无法分配一个常量大小为 0 的数组”。

意味着不知何故 4096X4096X256 的大小变得比 MAX_INT_LIMIT 大小 (2^31) 太大,并且可能会环绕并变成 -ve 左右。但是它应该将错误作为“负下标”。

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

这个错误的原因是什么?

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

解决方法是什么?

谢谢。

-通用汽车。

4

2 回答 2

9

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

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

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

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

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

于 2009-05-26T12:00:09.693 回答
0

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

根据您的平台,无符号长整数也可能是 32 位的,并且还会截断。

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

于 2009-05-26T12:01:41.047 回答