Когда mallo c () в C возвращает NULL? - PullRequest
1 голос
/ 22 января 2020

Mallo c возвращает ноль, если памяти кучи недостаточно ИЛИ, когда куча супер фрагментирована.

Я хотел бы знать, что при ДРУГИХ обстоятельствах, когда mallo c () возвращает NULL?

PS: При каких обстоятельствах mallo c может возвращать NULL? не отвечает на мой вопрос

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Когда malloc() in C возвращает NULL?

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

Это может быть вызвано:

  1. Недостаточно памяти в машине (недостаточно байтов)
  2. Недостаточно памяти для процесса ( ОС может ограничить пространство на процесс)
  3. Недостаточно памяти (слишком много выделений, у некоторых распределителей есть этот предел)
  4. Слишком фрагментировано (достаточно памяти, но распределитель не может / не хочет реорганизовать в непрерывный блок).
  5. Всевозможные причины, например, ваш процесс не достоин и более.

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 не «использует» память на моем компьютере?

1 голос
/ 22 января 2020

Если по какой-то причине память, которую вы запрашиваете для mallo c, не может быть выделена или иногда, если вы запрашиваете 0 память, она возвращает NULL.

Проверьте документацию

...