我有以下方法从PPM文件中读取颜色:
??? getColors(FILE *fd, int width, int height){
COLOR (*colors)[width] = malloc( sizeof(COLOR[height][width]) );
int i,j;
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
fscanf(fd,"%d %d %d", &colors[i][j].red, &colors[i][j].green, &colors[i][j].blue);
}
}
return colors;
}
其中fd是文件,指针指向第一种颜色,宽度和高度是PPM文件的宽度和高度。我回来的类型是什么?
编辑:
我理解,我正在返回一个指针1d数组,这个数组的大小是2d数组吗?
所以
COLOR (*getColors(FILE *fd, int width, int height))[]{
COLOR (*colors)[width] = malloc( sizeof(COLOR[height][width]) );
int i,j;
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
fscanf(fd,"%d %d %d", &colors[i][j].red, &colors[i][j].green, &colors[i][j].blue);
}
}
return colors;
}
是我要回来的,我正在使用它:
COLOR *colorValues[];
colorValues = getColors(fd, width, height);
正确?
答案 0 :(得分:0)
“编辑”中的功能签名是正确的。你可以在这里使用typedef。通常我会建议不要使用数组typedef,但是当函数返回指向数组的指针时很难读取,因为某些返回类型位于参数列表之后。例如:
typedef COLOR ColorArray[];
ColorArray *getColors(FILE *fd, int width, int height) {
用法应为:
COLOR (*colorValues)[width] = getColors(fd, width, height);
虽然你可以在声明中省略width
,但这意味着你以后不能继续写colorValues[a][b]
。您必须使用强制转换或稍后分配给指向填充了该维度的数组的指针。
答案 1 :(得分:-1)
在C中,数组在传递或返回时被视为指针。
COLOR *c
和
COLOR c[]
以同样的方式对待。访问数组元素的行为与取消引用指针相同。
c[i]
被编译器理解为
*(c+i)
数组访问取消引用存储在内存地址c + i *sizeof(c)
的值。
当您使用malloc( sizeof(COLOR[height][width]) );
分配内存时,您创建了一个数组数组。另一种思考这个对象的方法是指向存储器地址的指针,其中存储了更多指针。这些指针中的每一个都指向一个数组。所以对象** COLOR,COLOR [] []和* COLOR []都代表相同的东西,并且可以以相同的方式使用。从技术上讲,存在细微差别,但我不会在这里提及它们。
此外,将2D数据存储在一维阵列中通常更有效。这是因为在单个内存块中移动比在块之间移动更有效。
所以而不是
COLOR (*colors)[width] = malloc( sizeof(COLOR[height][width]) );
color[row][column]
你可以使用
COLOR *colors = malloc(width*height*sizeof(COLOR);
color[row*numcolumns+column]