malloc (0) fonctionne réellement?

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.