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

我的项目有问题。 我必须制作一个可变大小的2D数组来存储一些预测误差。这是关于图像的。 麻烦的是我必须加载不同大小的图像,所以对于每个图像,我必须进入一个文件,相应的像素数的二维数组..我在你的问题中搜索,但它不是我在看什么for.Can有人帮助我吗?

谢谢

如果你在函数范围内有一个现代的C编译器(至少是C99),它就像这样简单:

unsigned arr[n][m]; 

这称为可变长度数组(VLA)。 如果arrays太大,可能会出现问题。 因此,如果您有大图像,您可以这样做:

 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 = malloc(sizeof *arrp * rows); ... for (i = 0; i < rows; i++) arrp[i] = &arr[i * rows]; ... arrp[i][j] = ...; 

记住你必须释放arrarrp

如果你有一个C99实现,你可以设置一个指向VLA的指针,如下所示:

 int (*arrp)[cols] = (int (*)[cols]) arr; ... arrp[i][j] = ...; 

请注意,在这种情况下,您不是为辅助arrays分配任何内存,也不需要手动计算指向主arrays的指针; 你所要做的就是将arrp设置为与arr相同的位置,让指针算术的规则完成所有工作。

如果图像不是那么大,你可以设置一个VLA(再次,C99或更高版本):

 int arr[rows][cols]; 

但在实践中,这不是一个好主意; 堆栈框架的大小通常非常有限。

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

例如:

 int n=10; <<-u can change this. int **a; a=(int **)malloc(sizeof(*int)*n); for (int i=0;i