какой смысл malloc (0)?

Просто видел этот код:

artist = (char *) malloc(0);

и я задавался вопросом, почему можно было бы сделать это?

115
задан Iharob Al Asimi 6 October 2015 в 03:40
поделиться

6 ответов

Согласно спецификациям, malloc(0) вернет либо "нулевой указатель, либо уникальный указатель, который может быть успешно передан в free()".

Это, в сущности, позволяет ничего не выделять, но, тем не менее, передавать переменную "artist" на вызов функции free() не беспокоясь. Для практических целей это практически то же самое, что и делать:

artist = NULL;
118
ответ дан 24 November 2019 в 02:27
поделиться

Не уверен, что по какому-то найденному мною коду случайного кода malloc вход 0 приводит к возвращаемому значению NULL. Так что это сумасшедший способ установки указателя художника на NULL.

http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html

-1
ответ дан 24 November 2019 в 02:27
поделиться

malloc(0) не имеет для меня никакого смысла, если только код не опирается на поведение, специфичное для данной реализации. Если код предназначен для переноса, то он должен учитывать тот факт, что NULL возврат от malloc(0) не является неудачей. Так почему же просто не присвоить NULL исполнителю artist, так как это действительный успешный результат, и это меньшее количество кода, и не заставит ваших обслуживающих программистов потратить время на его разгадку?

malloc(SOME_CONSTANT_THAT_MIGHT_BE_ZERO) или malloc(some_variable_which_might_be_zero), возможно, могли бы иметь свое применение, хотя опять-таки нужно быть очень внимательным, чтобы не трактовать NULL возврат как неудачу, если значение равно 0, а размер 0 должен быть в порядке.

3
ответ дан 24 November 2019 в 02:27
поделиться

Поведение malloc (0) зависит от реализации. Библиотека может возвращать NULL или иметь обычное поведение malloc без выделенной памяти. Что бы он ни делал, это нужно где-то задокументировать.

Обычно он возвращает действительный и уникальный указатель, который НЕ должен разыменовываться. Также обратите внимание, что он МОЖЕТ потреблять память, даже если на самом деле ничего не выделял.

Можно перераспределить ненулевой указатель malloc (0).

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

10
ответ дан 24 November 2019 в 02:27
поделиться

В стандарте C (C17 7.22.3/1) говорится:

, Если размер пространства, которое запрошенный, является нулем, поведение является определенной реализацией: или нулевой указатель возвращается, или поведение состоит в том, как будто размер был некоторыми ненулевое значение, за исключением того, что возвращенный указатель не должен использоваться для доступа к объекту.

Так, malloc (0) мог возвратиться ПУСТОЙ УКАЗАТЕЛЬ или допустимый указатель , который не может быть разыменован . В любом случае это совершенно допустимо для вызова свободный () на нем.

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

Рассмотрение кода в ссылке, я полагаю, что у автора было два неправильных представления:

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

Так, он удостоверился, что у художника и другие переменные всегда было некоторое "допустимое" значение в них. В комментарии говорится так же: //они должны всегда указывать на malloc'd данные .

49
ответ дан 24 November 2019 в 02:27
поделиться

По общему признанию, я никогда не видел этого раньше, это первый раз, когда я видел этот синтаксис, можно сказать, классический случай наполнителя функций. В сочетании к ответу Рида, я хотел бы отметить, что есть похоже, что похоже на перегруженную функцию Realloc :

  • FOO ненутренний и размер равен нулю, Realloc (Foo, размер); . Когда вы проходите в ненулевом указателе и размере нуля до Realloc, Realloc ведет себя так, как будто вы звонили бесплатно (...)
  • FOO - это нуль, а размер ненулено и больше 1, Realloc foo, размер); . Когда вы проходите в нулевой указатель и размере, ненулено, Realloc ведет себя так, как будто вы позвонили Malloc (...)

Надеюсь, это поможет, С уважением, Том.

2
ответ дан 24 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: