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

可能重复:
C编程,为什么这个大型数组声明会产生分段错误?

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

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

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

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

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

使用malloc分配具有不同行长问题的多维数组几乎就是它。

以下是如何在C中的免费商店中分配和释放2D数组:

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

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

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