Освобождение указателя на структуру, содержащую массив - PullRequest
0 голосов
/ 29 июня 2019

У меня есть некоторые проблемы, возможно, из-за неправильного понимания того, как работает функция «free».По сути, я определил структуру, подобную этой

typedef char parola[11]
typedef struct _node node
struct _node
{
  parola wrd;
  node *padre;
  node *Ts;
  node *Td;
};

Позже в коде я выделяю память для узла, используя malloc:

node *r
r = (node *) malloc(sizeof(node));

И я создаю двоичные деревья поиска, выделяющие память для каждогоузел таким образом.Когда я пытаюсь удалить узел в bst, я передаю указатель на этот узел * n.Я думаю, что прибиваю рекурсивную процедуру, но потом, когда дело доходит до использования free () для указателя на узел, это, похоже, не работает.Я уверен в этом, потому что если я попытаюсь напечатать «parola» в узле, он действительно напечатает слово, которое содержалось там после освобождения памяти.

node *n

.../*in another function*/

free (n)

printf("%s\n",n->wrd)
/*This does print the word inside the node after the deallocation*/

Чего мне здесь не хватает?Нужно ли мне использовать free () по-другому?

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 29 июня 2019

В C free не стирает данные. Он просто говорит: «Я его больше не использую; ты можешь использовать его для чего-то другого». Если в это время ничего не нужно использовать, оно не будет перезаписано.

Однако вы не можете гарантировать, что он не будет перезаписан. Использование вещи после free d - это отличный способ неожиданно завершить работу вашей программы, непредсказуемо потерпеть неудачу в самый неподходящий момент.

(Убедитесь, что вы освобождаете узлы, на которые вы указываете, прежде чем выбросить (или освободите) их последний указатель (и), и убедитесь, что вы освобождаете каждую вещь только один раз!)

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