3

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

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

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

4 回答 4

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[]对于 C++)您分配的内存以避免内存泄漏。

于 2012-09-23T14:04:58.577 回答
2

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

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

Using malloc for allocation of multi-dimensional arrays with different row lengths 问题与此有关。

于 2012-09-23T14:05:29.823 回答
2

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

unsigned char (*idata)[1400] = malloc(1600 * 1400);
// ...
free(idata);
于 2012-09-23T14:12:19.627 回答
0

当您使用诸如 之类的表达式unsigned char idata[sz1][sz2]时,数组的空间在堆栈中分配,而堆栈的空间在某种程度上非常小,这会导致您出现问题。

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

于 2012-09-23T14:08:43.950 回答