J’appelle free (), mais le pointeur contient toujours des données et son contenu n’a pas changé

Le code est ci-dessous.

Ma question concerne le résultat. Je veux comprendre, pourquoi après avoir appelé free (p) p-> elem se change en ‘0’, mais que p-> str contient toujours “bonjour”?

#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

Libérer de la mémoire ne supprime pas le pointeur ou la mémoire sur laquelle il pointe (sauf dans des circonstances particulières censées faciliter le débogage de tels problèmes – ne vous fiez jamais au comportement de ce comportement). Utiliser un pointeur après avoir libéré la mémoire sur laquelle il a pointé est invalide et constitue un comportement indéfini . Cela pourrait aussi bien provoquer un crash ou provoquer l’impression de valeurs aléatoires.

De plus, en C, vous ne devriez pas lancer le retour de malloc .

Premièrement, ne faites jamais cela dans le code réel. Votre code fonctionne maintenant uniquement parce que la mémoire n’a pas encore été réclamée par d’autres allocations et qu’il y a toujours un “fantôme” de l’ancienne structure allouée.

Sur la question, votre pointeur p-> str pointe vers un littéral constant, c’est-à-dire un morceau de texte “codé en dur” dans les données de l’application. Par conséquent, le pointeur sur celui-ci sera valide pendant toute la durée de vie de l’application – voici un exemple “plus valide”:

 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