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

Mel*_*uha 3 c arrays multidimensional-array

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

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

    unsigned char idata[1400][1400]; //working fine
    unsigned char idata[1600][1400]; //not working
Run Code Online (Sandbox Code Playgroud)

Set*_*gie 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];
Run Code Online (Sandbox Code Playgroud)

要在免费商店中分配它,你应该没有问题.

编辑:

我只是看了标签,并没有看到你只是在谈论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);
Run Code Online (Sandbox Code Playgroud)

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

  • 从什么时候开始C有`new`? (2认同)