Por una razón u otra, deseo rodar manualmente una versión cero de malloc()
. Para minimizar la complejidad algorítmica, quiero escribir:Memset() se llama con un puntero nulo si el tamaño es 0?
void * my_calloc(size_t size)
{
return memset(malloc(size), 0, size);
}
¿Es esta bien definido cuando size == 0
? Está bien llamar al malloc()
con un tamaño cero, pero eso le permite devolver un puntero nulo. ¿Será correcta la invocación posterior de memset
, o es este comportamiento indefinido y necesito agregar un if (size)
condicional?
¡Me gustaría evitar las verificaciones condicionales redundantes!
Supongamos por el momento que malloc()
no falla. En realidad, habrá una versión enrollada a mano de malloc()
allí, que terminará en caso de falla.
Algo como esto:
void * my_malloc(size_t size)
{
void * const p = malloc(size);
if (p || 0 == size) return p;
terminate();
}
AFAIK 'memset' no es necesario para comprobar NULL, por lo que si el' malloc' falla, va a cero bytes 'size' a partir de la dirección 0. – Praetorian
@Praetorian: Lo siento, he añadido esto más adelante: Supongamos que' malloc() 'nunca falla. La pregunta es solo si 'size' puede ser' 0'. –