2009-06-16 28 views
3

我需要静态(在* .h)文件中定义一个大小为12884901888的数组。定义大于无符号整数限制的大数组

unsigned char sram[12884901888]; //All of my code is C. 

上面的声明给出错误,不起作用。

因为数组声明中使用的常量是unsigned int。但是我需要使用的常量(12884901888)大于unsigned int限制。

如何定义12884901888以上的数组?

谢谢。

-AD

P.S.我知道很多人会说,优化这个庞大的数组大小,但我需要使用相同的原因特定于我的情况。

+0

你可能想要考虑使用一个二维数组。在这种情况下,我忘记了标准所说的内容,但我相当肯定(至少在C90中)固定大小的二维数组可以保证使用行指针布局。如果是这种情况,那么二维数组可以被当作一维数组(当然,使用行指针布局“公式”)。 – 2009-06-17 07:38:42

回答

2

使数组维度为无符号long long。

unsigned char sram[12884901888ULL]; 
+0

取决于编译器。如果它首先将长度转换为size_t,那么它将不起作用。 – finnw 2009-06-16 08:55:45

2

这是一个嵌入式微控制器?你可以经常用类似逃脱:

#define sram (*((unsigned char (*)[1]) 0)) 

除非你的编译器实现了边界检查,数组的大小并不重要。在任何情况下,您都不希望编译器尝试保留12884901888字节,因为链接将失败。

+0

@finnw:你可以解释一下,你提到的宏是什么?一些指向数组的指针,...? – goldenmean 2010-02-04 17:06:32

0

转换12884901888为十六进制给出:0x3-0000-0000 (I分离的16位各组)

换言之,此数组的无符号字节需要千兆3次4 编译器应该产生34位地址指针为此工作

我同意finnw,你不需要告诉编译器数组的大小。如果确实指定了大小,那么将为该模块获取一个较大的OBJ文件,并为最终的可执行文件获取类似的大型ELF/EXE。

相关问题