如何在C中声明可变大小的2D数组?

如何在C中声明可变大小的2D数组?,c,arrays,multidimensional-array,dynamic-memory-allocation,C,Arrays,Multidimensional Array,Dynamic Memory Allocation,我对一个项目有问题。我必须制作一个可变大小的2D数组来存储一些预测错误。这是关于图像的。问题是我必须加载不同大小的图像,因此对于每个图像,我必须将相应像素数的2D数组放入一个文件中。我已经在你的问题中搜索了,但这不是我要找的。有人能帮我吗 谢谢您需要动态分配内存。使用双指针逻辑 例: int n=10 如果您在函数范围内有一个现代C编译器(至少是C99),它非常简单: unsigned arr[n][m]; 这称为可变长度数组(VLA)。如果阵列太大,可能会出现问题。因此,如果您有大型图像,您

我对一个项目有问题。我必须制作一个可变大小的2D数组来存储一些预测错误。这是关于图像的。问题是我必须加载不同大小的图像,因此对于每个图像,我必须将相应像素数的2D数组放入一个文件中。我已经在你的问题中搜索了,但这不是我要找的。有人能帮我吗


谢谢

您需要动态分配内存。使用双指针逻辑

例:


int n=10 如果您在函数范围内有一个现代C编译器(至少是C99),它非常简单:

unsigned arr[n][m];
这称为可变长度数组(VLA)。如果阵列太大,可能会出现问题。因此,如果您有大型图像,您可以:

unsigned (*arr)[m] = malloc(sizeof(unsigned[n][m]));
后来

free(arr);

如果您需要连续的内存,您有两个选择

您可以动态分配单个内存块,然后手动计算偏移量,如下所示:

size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
您可以在主数组中设置第二个指针数组:

int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
  arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
请注意,在这种情况下,您不需要为辅助数组分配任何内存,也不需要手动计算指向主数组的指针;您所要做的就是将
arrp
设置到与
arr
相同的位置,并让指针算术规则完成所有工作

如果图像没有那么大,您可以设置VLA(同样是C99或更高版本):


但实际上这不是一个好主意;堆栈帧的大小通常非常有限

当然不是,但是你可以让它表现得像一个数组为什么在你可以使用一个数组的时候使用一个2D数组的模拟呢?好吧,这就是本机C的局限性。动态数组的创建,或者说内存分配是C中的一个主要缺陷,它让人望而却步。它仍然是一种很好的语言,因为它提供了原始的力量。这个例子证明了你可以做一些低级的操作来达到想要的结果,但是你仍然没有回答我的问题。C动态分配了多维数组。你到底为什么要模仿这种语言提供的功能?恐怕你错了。我不知道C99标准,但旧版本,如K&RC(原始版本)不支持“inta[m][n];”记住,上面提到的可变长度数组将在堆栈上分配。第二个与问题不太相关的问题是C++ 0x不支持这个特性(但是,因为这是一个C问题,所以很好)@ Yavar,这也是为什么我还提到了用<代码> MALLC/<代码>分配的版本。即便如此,它也是一种“可变修改类型”。C++显然有其他方法来做多维数组,所以,这根本不相关。在你的第三种情况下,我认为分配是最好的,就像我在答案中所做的那样。直接
malloc
,不需要强制转换,这只会混淆。
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
int arr[rows][cols];