malloc (0) realmente funciona?

Posible duplicado:
¿Cuál es el punto en malloc (0)?

¿Por qué malloc (0) devuelve un puntero válido para escribir?

char *str = NULL; str = (char*)malloc(0); // allocate 0 bytes ? printf("Pointer of str: %p\n", str); strcpy(str, "A very long string ..................."); printf("Value of str: %s", str); free(str); // Causes crash if str is too long 

Salida:

 Pointer of str: 0xa9d010 Aborted Value of str: A very long string ................... 

Cuando str es más corto, entonces simplemente funciona como debería.

BTW: Para comstackr usé GCC con “-D_FORTIY_SOURCE = 0 -fno-stack-protector”

 *** glibc detected *** ..: free(): invalid next size (fast): 0x0000000000a9d010 *** 

¿Por qué malloc(0) devuelve un puntero válido para escribir?

No devuelve un puntero válido para escribir. Devuelve un puntero válido para no usarlo . O puede devolver NULL también, ya que el estándar C especifica que este caso debe ser definido por la implementación.

Es un comportamiento indefinido desreferenciar el puntero devuelto por malloc(0) .

De la norma C:

(C99, 7.20.3p1) “Si el tamaño del espacio solicitado es cero, el comportamiento está definido por la implementación: se devuelve un puntero nulo o el comportamiento es como si el tamaño fuera un valor distinto de cero, excepto que el puntero devuelto no ser utilizado para acceder a un objeto “.

Se supone que malloc () devuelve un puntero void *. Y lo hace fielmente. Pero lleva a UB cuando lo desreferes.