У меня есть некоторые проблемы с пониманием того, как работает функция free() в C. То, что делает think free(), является, как говорит название, освобождать память по адресу, который был передан в качестве аргумента. Затем я попробовал следующий код:Работа свободных() в C
#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *first, *second, *temp;
first = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
temp = first;
first->data = 1;
first->next = second;
second->data = 2;
second->next = NULL;
free(first);
while(temp!=NULL)
{
printf("%d\n", temp->data);
temp = temp->next;
}
return 0;
}
Вышеупомянутая информация является очень простой реализацией связанного списка. Я создал два узла, а именно первый и второй, подал данные и связал их вместе. Затем я освободил первый узел и попытался напечатать связанный список. я получил следующий вывод:
Итак, вот мой вопрос, почему же второй узел печатаемого? Если первый узел был освобожден, все данные и следующий указатель должны были быть удалены. Даже если бы я это сделал
temp = first;
Я только что скопировал адрес с первого по темп. Когда я освобождаю сначала, все, что было сохранено, должно быть уничтожено, включая адрес второго узла. Итак, как я могу распечатать второй узел?
UB и multi-dup :( –
, когда вы делаете память malloc(), будет выделена из кучи для вашей программы .. как только вы освободите память, используя free(), память будет возвращена к доступному фрагменту, поэтому что другая программа может использовать эту память. Она не будет уничтожать данные, записанные в эту память, до тех пор, пока она не будет записана какой-либо другой программой. –
Возможно, вас раздражает, почему temp-> данные, кажется, обнуляются, а temp-> следующий - нет. Это связано с тем, что метаданные записываются в (часть данных) выделенного фрагмента памяти на 'free()' (так называемый _free-list_) и не являются механизмом уничтожения данные на систематической основе бесплатно. – Ctx