Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中数组的最大大小有限制吗?_C_Arrays_Multidimensional Array - Fatal编程技术网

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

c中数组的最大大小有限制吗?,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,可能重复: 我正在读一个c语言的图像,但我不能这样做,因为我的程序正在中间停止。。。调试后我发现这是由于数组大小。。。阵列的最大大小有限制吗? 如果我声明的数组大小为1400X1400,一切正常,但如果我定义的数组大小为1600X1400,我的程序将停止工作。。。为什么如此。。。编译器或操作系统对数组大小有限制吗?如果是这样的话,在c中的解决方案是什么 unsigned char idata[1400][1400]; //working fine unsigned char i

可能重复:

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

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

我猜
idata
是一个局部变量。问题是局部变量存储在堆栈上(技术上称为“自动存储”),而堆栈比您试图在其上分配的6400兆字节小得多。在其上分配那么多存储会导致堆栈溢出

试一试


不要忘记
释放
(或
删除[]
,对于C++)分配的内存,以避免内存泄漏。

如果在堆栈上声明此项(例如在某些函数中),则是,它将提供堆栈溢出

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


问题就在于此。

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


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

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

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

它停止工作或无法编译?我认为编译器和设备是最可能的限制来源,我在C语言中从未遇到过这样的限制。我们很可能真的需要看到失败的代码——除非它根本没有编译。在标准C(1999年标准)中,类型
size\u t
用于指定以字节为单位的最大对象大小(其中byte=
char
)。
size\u t
的最大值是
size\u MAX
(定义见
)。@Flexo通常用他们想要的解决方案的语言来标记问题。它被标记为C++,所以我用C++回答,无论如何,它并不是很大的一部分,而是把它转换成C。这个问题被标记为C和C++,但我编辑了,因为在问题文本中,它清楚地表明了语言是C,而且坦白说,我厌倦了看到C/C++标签混合时,不应该:)@ LucangGrigor是的,已经很久以来我使用<代码>新< /Cord>(特别是对于多维数组)我完全忘记了它的语法。谢谢你的耐心。对不起,我不知道他说的正是C。如果是c,可以使用malloc之类的函数。而如果是C++,则可以使用新的。
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);
unsigned char (*idata)[1400] = malloc(1600 * 1400);
// ...
free(idata);