我有一个项目的问题。我需要创建一个变量大小的二维数组来存储一些预测误差...这与图像有关。问题是我需要加载不同尺寸的图像,因此对于每个图像,我都需要从文件中获取相应数量像素的二维数组..我已经搜索了你们的问题,但这不是我想要的。有人可以帮帮我吗?
谢谢
我有一个项目的问题。我需要创建一个变量大小的二维数组来存储一些预测误差...这与图像有关。问题是我需要加载不同尺寸的图像,因此对于每个图像,我都需要从文件中获取相应数量像素的二维数组..我已经搜索了你们的问题,但这不是我想要的。有人可以帮帮我吗?
谢谢
如果您在函数作用域内有一款现代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 = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
请记住,您需要释放两个arr
和arrp
。
如果您有C99实现,可以像下面这样设置指向VLA的指针:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
arrp
设置为与 arr
相同的位置,并让指针算术规则完成所有工作。int arr[rows][cols];
但实际上这并不是一个好主意;堆栈帧的大小通常非常有限。
malloc
,无需转换,这只会使代码更加晦涩难懂。 - Jens Gustedtint n=10; <<-u can change this.
int **a;
a=(int **)malloc(sizeof(*int)*n);
for (int i=0;i<n;i++){
a[i]=(int *)malloc(sizeof(int)*n);// or *(a+i)
}
malloc
分配的版本。即使如此,它仍然是“可变修改类型”。而且C++显然有其他方法来处理多维数组,所以是的,这完全不相关。 - Jens Gustedt