2010-12-16 20 views
19

Como he leído, realloc actuará como malloc si el tamaño apuntado es 0, lo estaba usando sin malloc(), siempre que el puntero fuera estático, global o explícitamente establecido en NULL si fuera automático.¿Es necesario un malloc() antes de un realloc()?

Sin embargo, veo que muchos programadores intentan configurarlo o configurarlo en malloc (1). ¿Es necesario?

Respuesta

19

De Open Groups' specifications:

Si ptr es un puntero nulo, realloc() será equivalente a malloc() para el tamaño especificado.

Si ptr no coincide con un puntero devueltos anteriormente por calloc(), malloc() o realloc() o si el espacio previamente ha sido desasignado por una llamada a free() o realloc(), el comportamiento no está definido.

6

malloc no es necesario, puede usar realloc solamente.

malloc(n) es equivalente a realloc(NULL, n).

Sin embargo, a menudo es más claro utilizar malloc en lugar de la semántica especial de realloc. No es una cuestión de lo que funciona, pero no confunde a la gente que lee el código.

(Edit: mención eliminado de realloc que actúa como free, ya que no es estándar C. Véanse los comentarios.)

+3

Tenga en cuenta que la norma C99 para realloc con el tamaño 0 difiere ligeramente del estándar POSIX. El estándar C99 dice exactamente esto: * Si el tamaño del espacio solicitado es cero, el comportamiento es la implementación definida: se devuelve un puntero nulo o el comportamiento es como si el tamaño fuera un valor distinto de cero *. – JeremyP

+0

Entonces, ¿se puede hacer "p = malloc (n)" seguido de "realloc (p, 0)" cuando p no es NULO? ¡Realmente no lo haría! Perdón por el formato – dubnde

+0

Jeremy, ¿no está relacionado con el tamaño "solicitado"? ¿Qué tiene que ver con la reasignación del puntero anterior? –

Cuestiones relacionadas