Как правильно выделить и освободить память из 2D массива в списке массивов в структуре? - PullRequest
0 голосов
/ 24 января 2020

Я пишу программу, которая имеет большую структуру и меньшую структуру, меньшая из которых содержит имена друзей человека в индексе 0 двумерного массива в приложении Friends. Я написал все это с нуля несколько раз, и это продолжает давать мне либо ошибку сегмента, либо Thread 1: EXC_BAD_ACCESS (code=1, address=0x0).

Вот мои структуры:


1 Ответ

2 голосов
/ 24 января 2020

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(), а иногда нет. Актерский состав не нужен.

...