Linkedlist в программировании на C - PullRequest
0 голосов
/ 12 марта 2019

Я в настоящее время изучаю C, и одна из моих практик - создать связанный список на C.

typedef struct deck
{
    int index;
    struct deck *next;
} decks;

Мой вопрос заключается в том, почему я не могу создать новый связанный список следующим образом: (index,карта после "=" определяется как переменная)

decks* head = malloc(sizeof(decks));
decks* ptr = head;
for(int i = 0; i < 10; i++) {
  ptr -> index = i;
  ptr = ptr -> next;
  ptr = malloc(sizeof(decks));
}

Цените так много!

1 Ответ

3 голосов
/ 12 марта 2019

Protip на указатели отладки

Рисуем картинки. Сделайте прямоугольник для каждого экземпляра и стрелку из каждого ненулевого указателя. ВСЕГДА следуйте правилам, перечисленным ниже. Предполагая, что все управление памятью выполняется с malloc и free, нет никаких исключений из этих правил

  1. Каждый раз и только когда вы делаете malloc, вы должны нарисовать новую коробку.
  2. Каждый раз и только когда вы используете free, вы должны убирать (или просто скрещивать с X или чем-то) коробку.
  3. Каждый раз, когда вы используете free, уберите все стрелки из этого ящика.
  4. Каждый раз, когда вы назначаете указатель на значение, нулевое или ненулевое, удаляйте старую стрелку, если она существует.
  5. Каждый раз и только когда вы назначаете указатель на ненулевое значение, рисуйте стрелку.

Примечание. Для обычного вызова malloc вы должны использовать оба правила 1, 4 и 5. Использование malloc без учета указателя возврата означает утечку памяти.

Примечание 2: Важно! НЕ ДОЛЖНО убирать стрелку в поле, которое вы освобождаете, когда используете free. Делайте это только когда вы специально назначаете указатель на ноль. Точно так же НЕ снимайте флажок при назначении указателя на ноль.

Примечание 3: Важно! Если вы освобождаете ящик, правило 3 гласит, что вы должны удалить все стрелки из этого ящика. НЕ снимайте коробки, на которые указывают стрелки.

Ваш вопрос

Учтите это:

ptr = ptr -> next;
ptr = malloc(sizeof(decks));

Первая строка не имеет никакого эффекта, поскольку вы немедленно переназначаете ptr. Вам нужно что-то вроде этого:

ptr -> next = malloc(sizeof(decks));
ptr = ptr -> next;

Другие замечания

Я бы рекомендовал использовать sizeof для переменной, а не для типа, например так: ptr->next = malloc(sizeof *(ptr->next)) В общем, это хорошая привычка. Возьми этот код:

int *x;
x = malloc(sizeof(int));

Теперь рассмотрим, хотите ли вы изменить тип переменной x. Вам потребуется изменить аргумент на sizeof при КАЖДОМ вызове malloc. Использование x = malloc(sizeof *x) полностью устраняет эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...