Можно ли вызвать memset () с нулевым указателем, если размер равен 0?

По той или иной причине я хочу вручную выполнить обнуление версии malloc () . Чтобы минимизировать алгоритмическую сложность, я хочу для записи:

void * my_calloc(size_t size)
{
    return memset(malloc(size), 0, size);
}

Это четко определено, когда size == 0 ? Можно вызвать malloc () с нулевым размером, но это позволяет ему возвращать нуль Указатель. Будет ли последующий вызов memset в порядке, или это неопределенное поведение, и мне нужно добавить условное if (size) ?

Я бы очень хотел избежать избыточные условные проверки!

Предположим на данный момент, что malloc () не дает сбоя. На самом деле там также будет ручная версия malloc () , который завершится в случае сбоя.

Примерно так:

void * my_malloc(size_t size)
{
    void * const p = malloc(size);
    if (p || 0 == size) return p;
    terminate();
}

15
задан Matthew Slattery 21 December 2011 в 23:27
поделиться