我想在一些结构中使用二维数组:
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]
,但工作完全正常。
所以我的问题是为什么我不能使用第一种语法?与第二个有根本区别吗?
答案 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>