Проблема в методе insert
в строке кода, отмеченной вами в вопросе
sample->p[sample->id]->name = _name;
Нигде в вашей программе вы не выделяете память для массива p
внутри person
структура.Следовательно, это значение всегда будет NULL
.Попытка присвоить это значение по праву приведет к краху вашей программы.
Чтобы исправить это, необходимо убедиться, что массив p
достаточно большой, чтобы вместить индекс, предоставленный выражением sample->id
.Лучший способ сделать это - использовать функцию realloc
и добавить поле к person
для хранения размера массива p
Вот краткий пример.Примечание: проверка ошибок и 0 инициализация памяти опущены для bevity.
struct person{
struct element** p;
size_t length;
int id;
};
void insert(struct person* sample, char* _name, int _age)
{
if (sample->id >= sample->length) {
sample->p = realloc(sample->p, sizeof(element*) * sample->id);
}
...
}
Кажется странным, что имя и возраст всегда индексируются через поле sample->id
.Это указывает на то, что он всегда находится в одном и том же месте, и в этом случае массив не нужен.Можете ли вы уточнить, как это должно функционировать?