可能重复:
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
答案 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]
,则需要在堆上分配所需的空间。通常你可以获得你想要的空间。