¿Cuál es el punto de malloc (0)?

Resuelto jldupont asked hace 14 años • 18 respuestas

Acabo de ver este código:

artist = (char *) malloc(0);

...y me preguntaba ¿por qué se haría esto?

jldupont avatar Jan 08 '10 00:01 jldupont
Aceptado

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;
Reed Copsey avatar Jan 07 '2010 17:01 Reed Copsey

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 NULLo 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 npodrí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 , y
  • free(0)es malo.

Entonces, se aseguró de que esa artisty otras variables siempre tuvieran algún valor "válido". El comentario lo dice así: // these must always point at malloc'd data.

Alok Singhal avatar Jan 07 '2010 17:01 Alok Singhal

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.

Coincoin avatar Jan 07 '2010 17:01 Coincoin