Dupliquer possible:
quel est le sharepoint malloc (0)?
Pourquoi malloc (0) renvoie-t-il réellement un pointeur valide pour l’écriture?
char *str = NULL; str = (char*)malloc(0); // allocate 0 bytes ? printf("Pointer of str: %p\n", str); strcpy(str, "A very long ssortingng ..................."); printf("Value of str: %s", str); free(str); // Causes crash if str is too long
Sortie:
Pointer of str: 0xa9d010 Aborted Value of str: A very long ssortingng ...................
Lorsque str
est plus court, cela fonctionne comme il se doit.
BTW: Pour la compilation, j’ai utilisé GCC avec “-D_FORTIY_SOURCE = 0 -fno-stack-protector”
*** glibc detected *** ..: free(): invalid next size (fast): 0x0000000000a9d010 ***
Pourquoi
malloc(0)
renvoie-t-il réellement un pointeur valide pour l’écriture?
Il ne retourne pas un pointeur valide pour l’écriture. Il retourne un pointeur valide pour ne pas l’utiliser . Il peut également renvoyer NULL
car le standard C spécifie que ce cas doit être défini par la mise en oeuvre.
C’est un comportement indéfini de déréférencer le pointeur renvoyé par malloc(0)
.
De la norme C:
(C99, 7.20.3p1) “Si la taille de l’espace demandé est égale à zéro, le comportement est défini par l’implémentation: un pointeur null est renvoyé ou le comportement est comme si la taille était une valeur différente de zéro, sauf que le pointeur renvoyé doit ne pas être utilisé pour accéder à un object. ”
malloc () est censé renvoyer un pointeur vide *. Et il le fait fidèlement. Mais mène à UB lorsque vous le déréférence.