【问题标题】:Is there any limitation on the maximum size of array in c? [duplicate]c中数组的最大大小有什么限制吗? [复制]
【发布时间】:2012-09-23 14:02:31
【问题描述】:

可能重复:
C programming, why does this large array declaration produce a segmentation fault?

我正在读取 c 语言中的图像,但我无法这样做,因为我的程序在两者之间停止...调试后我发现这是由于数组大小...对最大大小有任何限制吗?大批? 如果我声明大小为 1400X1400 的数组一切正常,但如果我定义大小为 1600X1400 的数组,我的程序将停止工作......为什么会这样......编译器或操作系统对数组大小有任何限制吗?如果是这样,c 中的解决方案是什么。

    unsigned char idata[1400][1400]; //working fine
    unsigned char idata[1600][1400]; //not working

【问题讨论】:

  • 它停止工作或无法编译?
  • 我认为编译器和设备是最可能的限制来源,我在 C 语言中从未遇到过这样的限制。我们很可能真的需要查看失败的代码——除非它根本没有编译。
  • size_t 类型用于指定标准 C(1999 标准)中的最大对象大小(其中 byte = char)。 size_t 的最大值为SIZE_MAX(在<limits.h> 中定义)。

标签: c arrays multidimensional-array


【解决方案1】:

我猜idata 是一个局部变量。问题是局部变量存储在堆栈中(技术上是“自动存储”),并且堆栈比您尝试分配的 6400 兆字节小得多。在其上分配这么多存储会导致堆栈溢出。

试试

unsigned char** idata = new unsigned char*[DIM1];

for (int i = 0; i < DIM1; ++i)
    idata[i] = new unsigned char[DIM2];

// or

unsigned char (*idata)[DIM2] = new char[DIM1][DIM2];

在免费商店中分配它应该没有问题。

编辑:

我只是查看了标签,并没有看到您只是在谈论 C。如果是这样,您可以做同样的事情,但使用 malloc 而不是 new

unsigned char** idata = malloc(sizeof(unsigned char*) * DIM1);

for (i = 0; i < DIM1; ++i)
    idata[i] = malloc(DIM2);

// or

unsigned char (*idata)[DIM2] = malloc(DIM1 * DIM2);

并且不要忘记free(或delete[] 对于 C++)您分配的内存以避免内存泄漏。

【讨论】:

  • @Flexo 通常人们用他们想要解决方案的语言来标记问题。它被标记为 C++,所以我用 C++ 回答,无论如何将它转换为 C 并不是那么大的问题。
  • 删除了我的反对票。该问题被标记为 C 和 C++,但我进行了编辑,因为在问题文本中明确指出该语言是 C。坦率地说,我厌倦了看到不应该的混合 C/C++ 标签:)
  • @LuchianGrigore 是的,我已经很久没有使用new(尤其是多维数组)了,我完全忘记了它的语法。感谢您的耐心等待。
【解决方案2】:

如果你在堆栈上声明它(例如在某些函数中),那么是的,它会提供堆栈溢出。

您可以将其声明为静态(“全局变量”)或动态分配内存。

Using malloc for allocation of multi-dimensional arrays with different row lengths 问题差不多就是这个。

【讨论】:

    【解决方案3】:

    这是在 C 中的免费存储中分配和释放 2D 数组的方法:

    unsigned char (*idata)[1400] = malloc(1600 * 1400);
    // ...
    free(idata);
    

    【讨论】:

      【解决方案4】:

      当你使用像unsigned char idata[sz1][sz2]这样的表达式时,数组的空间是在堆栈中分配的,而堆栈的空间却非常小,这会给你带来问题。

      但是如果你使用无符号char* idata = new char*[sz],需要的空间分配在堆上。通常你可以得到你想要的空间。

      【讨论】:

      • 对不起,我没有意识到他说的是C。如果是c,可以使用malloc之类的函数。而如果是c++,你可以使用new。
      猜你喜欢
      • 2023-03-08
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2014-04-07
      • 2012-09-11
      相关资源
      最近更新 更多