如何在c中返回指向可变大小的二维数组的指针

时间:2016-02-12 01:29:53

标签: c arrays pointers multidimensional-array

我有以下方法从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);

正确?

2 个答案:

答案 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]