我的项目有问题。我必须制作一个可变大小的2D数组来存储一些预测误差。所以这是关于图像。麻烦的是我必须加载不同大小的图像,所以对于每个图像,我必须进入一个文件,相应的像素数的二维数组..我已经搜索了你的问题,但它不是我在看什么for.Can有人帮助我吗?
谢谢
答案 0 :(得分:6)
如果你在函数范围内有一个现代的C编译器(至少是C99),它就像:
一样简单unsigned arr[n][m];
这称为可变长度数组(VLA)。如果阵列太大,可能会出现问题。因此,如果你有大图像,你可以这样做:
unsigned (*arr)[m] = malloc(sizeof(unsigned[n][m]));
以后
free(arr);
答案 1 :(得分:2)
如果你需要内存是连续的,你有几个选择。
您可以动态分配单个内存块,然后手动计算偏移量,如下所示:
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] = ...;
记住你必须释放 {/ 1>}和arr
。
如果你有一个C99实现,你可以设置一个指向VLA的指针,如下所示:
arrp
请注意,在这种情况下,您不是为辅助阵列分配任何内存,也不需要手动计算指向主阵列的指针;您所要做的就是将int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
设置为与arrp
相同的位置,并让指针算术的规则完成所有工作。
如果图像不是那么大,你可以设置一个VLA(再次,C99或更高版本):
arr
但实际上这不是一个好主意;堆栈框架的大小通常非常有限。
答案 2 :(得分:0)
您需要动态分配内存。使用双指针逻辑。
前:
int 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)
}