【发布时间】:2012-03-12 00:12:14
【问题描述】:
我的项目有问题。我必须制作一个可变大小的二维数组来存储一些预测错误......所以这是关于图像的。问题是我必须加载不同大小的图像,因此对于每个图像,我必须将具有相应像素数的二维数组放入一个文件中。我已经在你的问题中进行了搜索,但这不是我正在寻找的有谁能帮帮我吗?
谢谢
【问题讨论】:
标签: c arrays multidimensional-array dynamic-memory-allocation
我的项目有问题。我必须制作一个可变大小的二维数组来存储一些预测错误......所以这是关于图像的。问题是我必须加载不同大小的图像,因此对于每个图像,我必须将具有相应像素数的二维数组放入一个文件中。我已经在你的问题中进行了搜索,但这不是我正在寻找的有谁能帮帮我吗?
谢谢
【问题讨论】:
标签: c arrays multidimensional-array dynamic-memory-allocation
如果您在函数范围内有现代 C 编译器(至少 C99),那么它很简单:
unsigned arr[n][m];
这称为可变长度数组 (VLA)。如果数组太大,可能会出现问题。因此,如果您有大图像,您可以这样做:
unsigned (*arr)[m] = malloc(sizeof(unsigned[n][m]));
以后
free(arr);
【讨论】:
malloc 分配的版本。即便如此,它也是一种“可变修改类型”。而且 C++ 显然还有其他方法来处理多维数组,所以是的,这根本不相关。
如果您需要内存是连续的,您有几个选择。
您可以动态分配单个内存块,然后手动计算偏移量,如下所示:
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 相同的位置,然后让指针运算规则完成所有工作。
如果图像不是那么大,您可以设置一个 VLA(同样,C99 或更高版本):
int arr[rows][cols];
但实际上这不是一个好主意;堆栈帧的大小通常非常有限。
【讨论】:
malloc就行了,不用强制转换,只会混淆。
您需要动态分配内存。使用双指针逻辑。
例如:
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)
}
【讨论】: