Освобождение динамически размещенного массива такое же, как освобождение связанного списка? - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у меня есть структура, которая выглядит следующим образом:

typedef struct node{
char **word_ptrs;
int value;
struct node *next;
} Node;

, и у меня есть динамически выделенные пробелы для связанного списка, а также word_ptrs в этой структуре.

Например:

Node *head = malloc(sizeof(Node)); // not important, what I care is not this node.
head->word_ptrs = malloc(10 * sizeof(Node)); // I care about this.

Мой вопрос: я знаю, как освободить связанный список, но я чувствую растерянность, когда пытаюсь освободить динамически размещенный массив.Когда я пытаюсь освободить массив выше, я должен просто освободить весь массив?Или мне следует освободить каждый символ * в этом массиве?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это зависит от того, откуда взялись эти указатели и кому они принадлежат.

Если они были выделены динамически, и узел владеет ими, то вы должны освободить их перед освобождением массива.
Если они были динамически размещены, но находились в другом месте, их соответствующие владельцы должны освободить их позже.
Если они не были распределены динамически, вы вообще не должны их освобождать.
Если у вас есть комбинация из трех, у вас проблемы.

Вы также должны выделить ее с помощью sizeof(char*),или sizeof(*head->word_ptrs), а не sizeof(Node).

Хотя, если размер всегда равен десяти, вы также можете использовать массив:

typedef struct node{
    char *word_ptrs[10];
    int value;
    struct node *next;
} Node;
0 голосов
/ 14 февраля 2019

Вы должны передать только free то, что было возвращено из malloc.

В этом случае вы делаете одно выделение для массива char *, поэтому вы делаете один free дляприберись.Кроме того, количество места, которое вы выделяете, составляет 10 * sizeof(Node), но оно должно быть 10 * sizeof(char *).

...