¿Cuál es el punto de malloc (0)?
Acabo de ver este código:
artist = (char *) malloc(0);
...y me preguntaba ¿por qué se haría esto?
Según las especificaciones, malloc(0) devolverá "un puntero nulo o un puntero único que puede pasarse exitosamente a free()".
Básicamente, esto le permite no asignar nada, pero aún así pasar la variable "artista" a una llamada a free() sin preocupaciones. A efectos prácticos, es prácticamente lo mismo que hacer:
artist = NULL;
El estándar C (C17 7.22.3/1) dice:
Si el tamaño del espacio solicitado es cero, el comportamiento está definido por la implementación: o 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 se utilizará para acceder a un objeto.
Por lo tanto, malloc(0)
podría devolver NULL
o un puntero válido al que no se le puede desreferenciar . En cualquier caso, es perfectamente válido invocarlo free()
.
Realmente no creo que malloc(0)
tenga mucha utilidad, excepto en los casos en que malloc(n)
se llama en un bucle, por ejemplo, y n
podría ser cero.
Al observar el código del enlace, creo que el autor tenía dos conceptos erróneos:
malloc(0)
devuelve un puntero válido siempre , yfree(0)
es malo.
Entonces, se aseguró de que esa artist
y otras variables siempre tuvieran algún valor "válido". El comentario lo dice así: // these must always point at malloc'd data
.
El comportamiento de malloc(0) es específico de la implementación. La biblioteca puede devolver NULL o tener el comportamiento normal de malloc, sin memoria asignada. Haga lo que haga, debe estar documentado en alguna parte.
Por lo general, devuelve un puntero que es válido y único pero que NO debe ser desreferenciado. También tenga en cuenta que PUEDE consumir memoria aunque en realidad no haya asignado nada.
Es posible reasignar un puntero malloc(0) no nulo.
Sin embargo, tener un malloc(0) palabra por palabra no es de mucha utilidad. Se usa principalmente cuando una asignación dinámica tiene cero bytes y no le importó validarla.