Такое поведение определяется реализацией.
От C standard:
Раздел 7.22.3.5 (realloc
):
Если ptr
пустой указатель, функция realloc
ведет себя как malloc
функции для заданного размера. В противном случае, если ptr
не совпадает с указателем ранее возвращенное управления памятью функции, или если пространство было высвобождены вызовом функцию free
или realloc
, поведение не определено. Если память для нового объекта не может быть выделена, старый объект не освобождается и его значение не изменяется.
Так realloc(NULL, 0)
такая же, как malloc(0)
Если мы затем посмотрим на раздел 7.22.3.4 (malloc
):
malloc
функция выделяет пространство для объекта, размер которого определяется size
и значение которого является неопределенным.
Функция malloc
возвращает либо нулевой указатель, либо указатель на выделенное пространство.
Стандарт не устанавливает, что происходит, когда 0
передается в
Но если вы посмотрите на Linux man page:.
malloc()
функция выделяет байт размера и возвращает указатель на выделенной памяти. Память не инициализируется. Если размер равен 0, , то malloc()
возвращает либо NULL, либо уникальное значение указателя, которое затем может быть отправлено . free()
.
В нем явно указано, что возвращаемое значение может быть освобождено, но не обязательно NULL.
В отличие от этого, MSDN говорит:
Если размер 0, таНос выделяет элемент нулевой длины в куче и возвращает действительный указатель на этот элемент. Всегда проверяйте возврат от malloc, даже если объем запрошенной памяти невелик.
Для MSVC вы не получите указатель NULL.
Возможный дубликат [Realloc on NULL-значный (или неопределенный) указатель] (http://stackoverflow.com/questions/12134315/realloc-on-null-valued-or-undefined-pointer) –
Возможный дубликат doesn 't адресует конкретную точку поведения 'void * vp = realloc (NULL, 0);'. –
Я согласен с @Jonathan здесь. похоже, что упомянутый дубликат не обсуждает поведение realloc'ing для 0 элементов и информацию об указателе, который вы вернетесь. Старые платформы Microsoft имели проблемы при распределении для 0 элементов. – jww