1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| int main() {
int *p; // pointeur invalide tant qu'il n'est pas initialisé
if (p) // /!\ ERREUR! pointeur invalide : comportement indéterminé
printf("ptr : %p\n", (void *)p); // /!\ ERREUR! comportement indéterminé pour les mêmes raisons
p = calloc(1, sizeof *p);
printf("ptr : %p\n", (void *)p); // OK, pointeur valide (contient NULL ou adresse acquise)
free(p); // OK, pointeur toujours valide
p = malloc(sizeof *p); // réinitialisation du pointeur pour la suite
int *q = realloc(p, sizeof *p); // note : passer NULL à realloc est autorisé (équivaut à un appel à malloc)
printf("temp ptr : %p\n", (void *)q); // OK, pointeur valide (contient NULL ou adresse acquise)
if (q) { // OK, pointeur toujours valide
// realloc a réussi
printf("ptr : %p\n", (void *)p); // /!\ ERREUR! pointeur invalidé par realloc : comportement indéterminé
p = q;
printf("ptr : %p\n", (void *)p); // OK, pointeur réinitialisé et donc valide
}
else
// realloc a échoué
printf("ptr : %p\n", (void *)p); // OK, pointeur valide (avec la valeur qu'il avait avant l'appel à realloc)
free(p); // OK, note : passer NULL à free est autorisé (no-op)
printf("ptr : %p\n", (void *)p); // /!\ ERREUR! pointeur invalidé par free
printf("temp ptr : %p\n", (void *)q); // /!\ ERREUR! pointeur invalidé par free, dans le cas où realloc avait réussi
return 0;
} |
Partager