2015-03-20 3 views
0
#include <stdio.h> 
#include <stdlib.h> 
typedef struct node{ 
    struct node *pre; 
    struct node *next; 
    int data; 
}NODE; //struct declaration 

int main(){ 

    NODE *new_node=(NODE*)malloc(sizeof(NODE)); //memory allocation 

    printf("\nnew_node addr: %d\n",new_node); 

    free(new_node); //deallocation 

    printf("new_node addr: %d\n",new_node); 


} 

Результат:Почему malloc не освобождается?

new_node addr: 2097152 
new_node addr: 2097152 
Program ended with exit code: 0 

Почему результаты такие же?
Я освобождаю память new_node. Но new_node имеет адрес.
Почему?

+0

По той же причине 'int a = 5; printf ("a =% d \ n", a); бесплатно (new_node); printf ("a =% d \ n", a); 'будет печатать' a = 5' дважды. – mah

+0

Wow Thanks !!!!!! – Kate

+0

Видимо, вы думаете, что я на самом деле не отвечаю вам, но я. Как и в моем глупом коде, нет причин для изменения значения 'a', нет смысла изменять значение' new_node'. – mah

ответ

7

free() не изменяет значение переданного на него указателя. Он просто освобождает память, выделенную этим указателем. Другими словами, указатель все же указывает на одно и то же место, там больше ничего не гарантировано.

Если вам нужно, чтобы обнаружить, что указатель был освобожден, присвоить его NULL:

new_node = NULL; 

Можно даже написать небольшой макрос, чтобы всегда делать это для вас (хотя я бы не рекомендовал его как это может сделать ваш код более трудным для чтения):

#define FREE_SET_NULL(pointer) free(pointer);pointer=NULL; 
+0

Тогда что я могу сделать, чтобы удалить адрес new_node? – Kate

+1

@ user4694907 Удаление адреса ничего не значит. То, что вы можете сделать, это установить адрес на то, что вы можете легко идентифицировать, не указывая нигде. Например, NULL! – juanchopanza

+0

Присвойте указателю NULL, если хотите, но это ничего не делает. Как только вы освободите() 'память, доступ к ней может привести к чему-либо, или ничего. Но это не ваше дело, потому что оно больше не принадлежит вам. –

8

Вызов free освобождает память, на которую указывает указатель, но не изменяет адрес памяти, хранящийся в этом указателе. После вызова free вы не должны пытаться использовать память. Чтобы быть в безопасности, вы можете вручную установить указатель на NULL:

free(new_node); 
new_node = NULL; 

Вы продали свой дом и он получил снесли, но вы по-прежнему есть адрес, написанный на листе бумаги.

+0

Тогда что я могу сделать, чтобы удалить адрес new_node? – Kate

+0

'new_node = NULL;' (ПОСЛЕ 'free()'), если это важно для вас, но, вероятно, нет. – mah

+0

Нет. Адрес становится 0. Спасибо !!!!! – Kate

Смежные вопросы