Intereting Posts
Канал в libssh закрывается без видимой причины В чем разница между этими двумя enumsми enums – C? Linux System Вызывает проблемы с использованием функции Fork (), передающей ints дочерним и родительским процессам союз против указателя void Использование гнезда Non Blocking в сканере портов scanf (“% d”, char *) – строка формата char-as-int? аргумент типа const char * несовместим с параметром типа “LPCWSTR” тестирование программного обеспечения для программы подсчета слов в streamе charatcers Кодирование нескольких каналов в C warning: присваивание отбрасывает квалификаторы из целевого типа указателя В C, что означает «публичный», когда ставится перед глобальной переменной? Почему деление работы на большее количество streamов занимает больше времени? Сочетание двух uint8_t как uint16_t Проверка состояния и присвоение переменной в одном выражении if Как изменить входящий пакет из NIC в C?

Я вызываю free (), но указатель все еще имеет данные, и содержимое не изменилось

Код ниже.

Мой вопрос связан с результатом. Я хочу понять, почему после вызова free (p) p-> elem переходит в «0», но p-> str все еще содержит «привет»?

#define LEN (sizeof(struct node)) typedef struct node { int elem; char *str; }*p_node; int main(void) { p_node p; p=(p_node)malloc(LEN); p->elem=99; p->str="hello"; printf("the p->elem:%d\n",p->elem); printf("the p->str :%s\n",p->str); free(p); printf("the p->elem:%d\n",p->elem); printf("the p->str :%s\n",p->str); return 0; } 

http://i.stack.imgur.com/rt1jf.png

Освобождение памяти на самом деле не очищает указатель или память, на которую она указала (за исключением специализированных обстоятельств, предназначенных для помощи в таких отладочных проблемах, никогда не полагайтесь на поведение). Использование указателя после освобождения памяти, на которую оно указывалось, является недопустимым, и это неопределенное поведение . Это может привести к сбою или вызвать случайные значения для печати.

Кроме того, в C вы не должны бросать возврат malloc .

Во-первых, никогда не делайте этого в реальном коде. Теперь ваш код работает только потому, что память еще не была заявлена ​​другими распределениями, и все еще есть «призрак» старой выделенной структуры.

По фактическому вопросу ваш указатель p-> str указывает на постоянный литерал, то есть fragment текста, который «жестко закодирован» в данных приложения. Следовательно, указатель на него будет действителен на протяжении всего жизненного цикла приложения – вот пример «более правдоподобный»:

 p_node p; p=(p_node)malloc(LEN); p->elem=99; p->str="hello"; char* pstr = p->str; free(p); printf("the pstr :%s\n",pstr); // still outputs "hello", because pstr would be just a pointer to "hardcoded" data