【问题标题】:Error 1 error C2148: total size of array must not exceed 0x7fffffff bytes I get this Error in C错误 1 ​​错误 C2148:数组的总大小不得超过 0x7fffffff 字节我在 C 中得到此错误
【发布时间】:2014-08-02 14:34:23
【问题描述】:

我想创建一个char[1 048 576][16 384][1024] 和一个int [1 048 576][16 384],但我得到一个错误!

我想制作一个 excel 可以处理的 3d 数组!

【问题讨论】:

  • 你肯定不想那样做。如果您可以创建这样的阵列,它将占用 16TB 的 RAM。 int 数组将占用 64GB 到 128GB 的​​ RAM,具体取决于您机器上 int 的大小。
  • 我认为你最好通过使用 mallocreallocfree 等函数来扩展数组来管理它。
  • 教你的是 Excel 必须有比这更智能的内存分配策略 ;-)。顺便说一句,我上次看(一定是 20 年前)时,Excel 可以做 32k x 32k 单元格之类的事情。有变化吗?

标签: c arrays


【解决方案1】:

要在 C 中“创建”一个数组,您需要分配一些内存,无论是静态的还是使用 malloc 动态的。 在任何情况下,阵列都会像在 RAM 中一样物理映射到您的计算机中。所以你需要有足够的物理空间来“制造”它。

在您的情况下,您需要一个大小为 char 的数组: 1048576*16384*1024*sizeof(char) = 1048576*16384 MByte,char大小为1字节。

这太过分了。 您得到的错误与此有关。 它告诉您可以请求的最大大小是有符号整数的最大数量。 请参阅:What is the maximum value for an int32?。 这远低于您要分配的数量。

如果你看excel,单元格都是空的,没有为它们保留内存,直到它们被填满。

【讨论】:

  • 我认为您的意思是 char 大小为 1 字节(这是标准)。
  • char 总是 1 个字节。可以不同的是 CHAR_BIT
  • 在 CHAR_BIT = 8 的系统上,上述数组为 16384 GB。即使 OP 运行在具有 lots 的 64 位操作系统上除非将数组声明为静态全局数组,否则它仍然会溢出堆栈(其大小通常为 1-8MB)。
  • 是的,字符大小改变了
  • 在 64 位系统上,int 足够大,可以容纳这样的地址范围。 (但典型的 i64 CPU 不能解决所有问题。)
【解决方案2】:

除非该数组是全局变量,否则它将分配在堆栈上,堆栈的大小是有限的(VC 通常为 1MB)。

大对象应该在堆上分配malloc。但是,这样一个巨大(大约 16TB)的对象永远无法放入任何普通设备的内存中。很有可能您实际上并不需要一次所有的内存。你应该重写你的算法。

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2017-01-22
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多