expandBig()
и expandFriends()
не присваивают значения новым данным.
Похоже как минимум проблема заключается в присвоении имени.
friends->name[friends->size]
не присваивается значение после expandFriends(friends)
, поэтому strcpy()
завершается неудачей.
void addFriend(Friends * friends, char * val) {
if(friends->size == friends->cap)
expandFriends(friends);
strcpy(friends->name[friends->size], val);
....
Рассмотрите возможность использования strdup()
// strcpy(friends->name[friends->size], val);
friends->name[friends->size] = strdup(val);
... и в InitializeFriends()
friend->name[i] = NULL;
Код, указанный ниже: утомительно на рассмотрение.
Был ли размер правильный? ИДК, теперь надо тащиться до friend
, найти его тип. ОК, это Friends
. Теперь найдите определение Friends
и посмотрите элемент char ** name
. Хорошо, теперь с char **
разыменованным мы получаем char *
. Это соответствует кодам sizeof(char*)
, поэтому sizeof(char*)
ОК.
friend->name = realloc(friend->name, sizeof(char*) * friend->cap);
Экономьте время. Код для размера указателя без ссылки, а не для типа. Это проще для правильного кодирования, просмотра и обслуживания.
Был ли размер правильным?
Да, по конструкции, sizeof *(friend->name)
- правильный размер.
// friend->name = realloc(friend->name, sizeof(char*) * friend->cap);
friend->name = realloc(friend->name, sizeof *(friend->name) * friend->cap);
// People * ret = (People*)calloc(DEFAULT_CAP, sizeof(People));
People * ret = calloc(DEFAULT_CAP, sizeof *ret);
Непонятно, почему код иногда возвращает ответ от *alloc()
, а иногда нет. Актерский состав не нужен.