Во-первых, ваши эти два случая
// dynamic multidimensional array of structures
man **men4;
men4 = malloc(10 * sizeof(man*));
for (i = 0; i < 10; i++)
men4[i] = malloc(10 * sizeof(man*));
и
// dynamic array of pointers to structure
man **men6;
men6 = malloc(10 * sizeof(*men6));
men6[3] = &john;
printf("*** %s ***\n", men6[3]->name);
концептуально одинаковы. В обоих случаях у вас есть указатель на указатель на man
. Вы используете эти указатели по-разному. Также первый имеет ошибку. Вместо:
men4[i] = malloc(10 * sizeof(man*));
Вы должны были написать:
men4[i] = malloc(10 * sizeof(man));
потому что каждый men4[i]
имеет тип "указатель на man
". Именно из-за этой ошибки я обычно предпочитаю, чтобы мои звонки malloc()
имели вид:
a = malloc(N * sizeof *a);
Итак, ваш звонок стал бы:
men4[i] = malloc(10 * sizeof *men4[i]);
Это менее подвержено ошибкам.
Итак, ответ на ваш вопрос (2) заключается в том, что вы должны использовать sizeof(man *)
только при выделении для men4
, но не внутри цикла. (Или, теперь вы знаете лучший способ для вызова malloc()
, так что цикл за пределами вызова становится men4 = malloc(10 * sizeof *men4);
.)
- Все правильно, за исключением вызова
malloc()
, как указано выше.
- См. Выше.
- Вы хотите структурировать массив указателей. Чтобы получить массив, вам нужно
[]
, так как это указатель на нужный вам указатель (многомерный), вам нужно два **
. Таким образом, вы получаете: man **(men7[10]);
, но поскольку []
связывается более плотно, чем *
, вы можете записать его как man **men7[10];
.
men4
не является многомерным массивом или массивом указателей. Это указатель на указатель на man
. Когда вы выделяете память для men4
, вы выделяете пространство для 10 указателей на man
. Затем каждому указателю выделяется место для 10 man
. Тот факт, что вы можете индексировать men4
как многомерный массив, является результатом такого распределения. В вашем цикле каждому men4[i]
могло бы быть выделено пространство для различного числа man
значений, если вам это нравится, что невозможно сделать с многомерными массивами.
Указатели не являются массивами. Массивы не указатели. Пожалуйста, прочитайте все вопросы и ответы в разделе 6 FAQ C для подробностей.