Я хочу использовать двумерную матрицу внутри некоторой структуры:Ошибка при использовании многомерного массива из 0 длиной
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]
, работа совершенно хорошо. Итак, мои вопросы почему я не могу использовать первый синтаксис? Есть ли принципиальная разница со второй?
Как компилятор знает расположение элементов вашего массива, поскольку он не имеет понятия о количестве строк или столбцов в коде, который не работает, или код, который «отлично работает»? –
Ну, может быть, я должен добавить, чем 'p-> rows = rows;' и 'p-> cols = cols;', что, похоже, позволяет компилятору узнать количество строк и столбцов при кастинге. edit done – Astt
Возможно, вам не нужно явно указывать двумерный массив в структуре 'another_struct * array [] []'. Вы можете просто объявить указатель и хранить данные в свободном хранилище, если не возражаете; указатель указывает на память, в которой хранятся нужные вам данные в необходимой форме (2-мерный массив можно рассматривать как массив массива). – Elyasin