Когда malloc()
in C возвращает NULL
?
malloc()
возвращает нулевой указатель , когда ему не удается выделить необходимое пространство .
Это может быть вызвано:
- Недостаточно памяти в машине (недостаточно байтов)
- Недостаточно памяти для процесса ( ОС может ограничить пространство на процесс)
- Недостаточно памяти (слишком много выделений, у некоторых распределителей есть этот предел)
- Слишком фрагментировано (достаточно памяти, но распределитель не может / не хочет реорганизовать в непрерывный блок).
- Всевозможные причины, например, ваш процесс не достоин и более.
malloc(0)
может вернуть нулевой указатель . C17 / 18 добавляет бит.
Если размер запрошенного пространства равен нулю, поведение определяется реализацией:
либо возвращается нулевой указатель для указания ошибки ,
или поведение такое, как если бы размер был некоторым ненулевым значением, за исключением того, что возвращенный указатель не должен использоваться для доступа к объекту.
malloc(0)
может вернуть нулевой указатель . (до C17 / 18)
Если размер запрошенного пространства равен нулю, поведение определяется реализацией:
либо возвращается нулевой указатель,
или поведение как если бы размер был некоторым ненулевым значением, за исключением того, что возвращенный указатель не должен использоваться для доступа к объекту.
"для указания ошибки" из C17 / 18 подразумевает для меня возвращение нулевого указателя является ошибкой, возможно, по одной из вышеуказанных 5 причин, и без ошибок malloc(0)
не возвращает нулевой указатель .
Я вижу это как тенденцию иметь p = malloc(n); if (p==NULL) error();
всегда равным true при ошибке, даже если n
равно 0. В противном случае можно кодировать как if (p==NULL && n > 0) error();
Если код хочет допустить выделение нуля для возврата NULL
в качестве ошибки, лучше сформировать вспомогательную функцию для проверки на n == 0
и возврата NULL
, чем для вызова malloc()
.
И наоборот, возврат не-1077 * нулевой указатель не всегда означает, что памяти достаточно. См. Почему Mallo c не «использует» память на моем компьютере?