c中数组的最大大小是否有限制?

时间:2012-09-23 14:02:32

标签: c arrays multidimensional-array

  

可能重复:
  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

4 个答案:

答案 0 :(得分:8)

我猜测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[] for C ++)你分配的内存以避免内存泄漏。

答案 1 :(得分:2)

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

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

Using malloc for allocation of multi-dimensional arrays with different row lengths  问题几乎就是它。

答案 2 :(得分:2)

以下是如何在C:

中的免费商店中分配和释放2D数组
unsigned char (*idata)[1400] = malloc(1600 * 1400);
// ...
free(idata);

答案 3 :(得分:0)

当你使用像unsigned char idata[sz1][sz2]这样的表达式时,数组的空间是在堆栈中分配的,而堆栈的空间在某种程度上非常小,这会导致你的问题。

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