使用0长度的多维数组时出错

时间:2015-11-30 16:54:20

标签: c arrays multidimensional-array

我想在一些结构中使用二维数组:

typedef struct{
    int rows;
    int cols;
    another_struct *array[][];
}some_struct;

但似乎我不能做不完整类型的多维数组,所以我选择使用another_struct *array[0][0];

以这种方式分配:

some_struct *allocate_some_struct(int rows, int cols){
    some_struct *p;
    uint32_t length;

    length = sizeof(some_struct) + rows * sizeof(another_struct *[cols]);
    p = malloc(length);
    p->rows = rows;
    p->cols = cols;
    return (p);
}

但每当我尝试以这种方式访问​​它时:((another_struct *[p->rows][p->cols])p->array)[i],我得到此error: used type 'another_struct *[p->rows][p->cols]' where arithmetic or pointer type is required

虽然(*((another_struct *(*)[p->rows][p-cols])&(p->array)))[i],但工作完全正常。 所以我的问题是为什么我不能使用第一种语法?与第二个有根本区别吗?

1 个答案:

答案 0 :(得分:0)

在C中输入是静态的,因此这意味着当你使用它时(编译完成时)必须完全知道每种类型。对于二维数组,这意味着必须知道所有维度,以便语言能够访问单个单元格。使用需要已使用的索引部分大小的公式来访问数组。对于单元格是单元格大小,但对于单元格数组,您必须知道在该方向上有多少单元格。

但是,有一种解决方法允许您使用[]括号进行索引,并且不需要知道任何大小,只需要知道单个单元格的大小。您必须使用指针,如下例所示:

double **new_matrix(int rows, int cols)
{
    double **res = malloc(rows * sizeof(double *));
    int i;
    for (i = 0; i < rows; i++)
        res[i] = malloc(cols * sizeof(double));
    return res;
}
void free_matrix(double **matrix, int rows)
{
    int i;
    for (i = 0; i < rows; i++) free(matrix[i]);
    free(matrix);
}
...
double **matrix = new_matrix(24, 3);
matrix[12][1] /* will access correctly row 13 and column 2 element */
...
free(matrix, 24); /* will free all allocated memory */

有一些解决方案可以让你分配整个矩阵(和一串中的指针(并允许直接在矩阵上使用free(3))但是我把这作为练习留给读者:)< / p>