【问题标题】:Defining a large array of size larger than a unsigned int limit定义一个大于 unsigned int 限制的大数组
【发布时间】:2009-06-16 08:43:46
【问题描述】:

我需要静态定义一个数组(在 *.h 中)大小为 12884901888 的文件。

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

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

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

如何定义上述数组,大小为 12884901888?

谢谢。

-AD

附:我知道很多人会说,优化那个巨大的数组大小,但出于某种特定于我的案例的原因,我需要使用相同的大小。

【问题讨论】:

  • 您可能需要考虑使用二维数组。在这种情况下,我忘记了标准所说的内容,但我相当确定(至少在 C90 中)固定大小的二维数组可以保证使用行指针布局。如果是这样,那么二维数组可以被视为一维数组(当然使用行指针布局“公式”)。

标签: c arrays declaration


【解决方案1】:

将数组维度设为 unsigned long long。

unsigned char sram[12884901888ULL];

【讨论】:

  • 取决于编译器。如果它先将长度转换为 size_t 则它将不起作用。
【解决方案2】:

这适用于嵌入式微控制器吗?您通常可以通过以下方式侥幸逃脱:

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

除非您的编译器实现边界检查,否则数组大小无关紧要。在任何情况下,您都不希望编译器尝试保留 12884901888 字节,因为链接会失败。

【讨论】:

  • @finnw:你能解释一下你提到的试图声明的宏 sram 是什么吗?一些指向数组的指针,...?
【解决方案3】:

将 12884901888 转换为十六进制得到:0x3-0000-0000 (我把每组16位分开)

换句话说,这个无符号字节数组需要 3 乘以 4 Gig 编译器应该为此生成 34 位地址指针

我同意 finnw,你不需要告诉编译器数组的大小。如果您确实指定了大小,您将获得一个用于模块的大型 OBJ 文件,以及用于最终可执行文件的类似大型 ELF/EXE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2022-08-04
    • 2023-03-27
    • 2010-10-09
    • 2012-12-15
    • 2012-09-11
    相关资源
    最近更新 更多