Skip to content

Instantly share code, notes, and snippets.

@mr21
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mr21/8835947 to your computer and use it in GitHub Desktop.
Save mr21/8835947 to your computer and use it in GitHub Desktop.
Les choses un peu cachees de malloc / realloc
/*
Que renvoyer lors d'un : malloc(0); ?
La regle dit que tout retour de malloc doit pouvoir aller dans free et realloc.
Du coup pour simplifier il est possible de renvoyer NULL.
*/
free(NULL); /* est valide et ne fait rien. */
/*
Le realloc d'un pointeur NULL est equivalent a un malloc,
ainsi ces deux lignes sont identiques:
*/
int* ptr = malloc(n * sizeof *ptr);
int* ptr = realloc(NULL, n * sizeof *ptr);
/*
Un realloc de 0 est equivalent a un free
(finalement il est possible de gerer toute sa memoire dynamique
sans jamais appeller "malloc" et "free" dans son code).
Ainsi ces deux lignes sont similaires:
*/
free(ptr);
realloc(ptr, 0);
/*
Sauf que realloc renverra NULL a ce moment la,
du coup on peut s'en servir pour resetter le ptr a NULL juste apres:
*/
ptr = realloc(ptr, 0);
/* au lieu de devoir faire: */
free(ptr), ptr = NULL;
/*
Surcharger malloc/free/realloc sans surcharger calloc est voue au segfault...
Impossible (ou presque) de savoir comment est fait le vrai calloc.
Du coup il est trop dangereux d'essayer de free sois meme un pointeur venant du vrai calloc.
*/
int* ptr = calloc(n, sizeof *ptr);
/* la ligne ci-dessus est un raccourci pour: */
int* ptr = malloc(n * sizeof *ptr);
if (ptr) memset(ptr, 0, n * sizeof *ptr);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment