Правило простое - указатель неинициализирован до тех пор, пока ему не будет назначен действительный адрес или пока не будет выделена память для хранения вещей и назначен начальный адрес для нового блока памятик этому.
Вы выделяете maxSize
указателей для person
, но затем не можете выделить struct
для каждого person[i]
перед выделением для name
и т. Д.
Таким образом, вы должны выделить структуру, например pointer[i] = malloc (sizeof *pointer[i])
, прежде чем пытаться выделить person[i]->name = calloc(21, sizeof(char ));
, ...
Также обратите внимание, что если вы выделяете на основе размера разыменованного указателя - вы никогда не будетеневерно определите ваше распределение (ваше распределение person
является правильным только в результате счастливой случайности), например,
person = malloc (maxSize * sizeof *person);
...
person[i] = malloc (sizeof *person[i]);
(и обратите внимание, что []
или ->
считается какразыменование)
person[i]->name = calloc (21, sizeof *person[i]->name);
Нет необходимости разыгрывать возврат malloc
, это не нужно.См .: Я разыграю результат malloc?