Нет ; Вы не разыгрываете результат, так как:
- В этом нет необходимости, поскольку
void *
автоматически и безопасно переводится в любой другой тип указателя в этом случае.
- Это добавляет беспорядок в код, приведения не очень легко читать (особенно если тип указателя длинный).
- Это заставляет вас повторяться, что обычно плохо.
- Может скрыть ошибку, если вы забыли включить
<stdlib.h>
. Это может вызывать сбои (или, что еще хуже, , а не - вызывать сбои в более поздней части совершенно другой части кода). Подумайте, что произойдет, если указатели и целые числа имеют разные размеры; тогда вы скрываете предупреждение путем приведения и можете потерять биты вашего возвращенного адреса. Примечание: начиная с C11 неявные функции ушли из C, и этот момент больше не актуален, поскольку нет автоматического предположения, что необъявленные функции возвращают int
.
В качестве пояснения обратите внимание, что я сказал: «Вы не разыгрываете», а не «вам не нужно , чтобы разыграть ». На мой взгляд, это не удалось включить актерский состав, даже если вы правильно поняли. В этом нет просто никакой выгоды, но куча потенциальных рисков, и в том числе актерский состав, указывает на то, что вы не знаете о рисках.
Также отметьте, как отмечают комментаторы, что выше говорится о прямом C, а не C ++. Я очень твердо верю в C и C ++ как отдельные языки.
Чтобы добавить, ваш код без необходимости повторяет информацию о типе (int
), что может вызвать ошибки. Лучше разыменовать указатель, используемый для хранения возвращаемого значения, чтобы «заблокировать» их вместе:
int *sieve = malloc(length * sizeof *sieve);
Это также перемещает length
вперед для повышения видимости и удаляет лишние скобки с sizeof
; они необходимы только , когда аргумент является именем типа. Многие люди, кажется, не знают (или игнорируют) это, что делает их код более многословным. Помните: sizeof
это не функция! :)
При перемещении length
вперед может увеличить видимость в некоторых редких случаях, следует также обратить внимание, что в общем случае лучше написать выражение как:
int *sieve = malloc(sizeof *sieve * length);
Так как сохранение sizeof
первым, в этом случае обеспечивает умножение по крайней мере с size_t
математикой.
Сравните: malloc(sizeof *sieve * length * width)
против malloc(length * width * sizeof *sieve)
секунда может переполнить length * width
, когда width
и length
меньше, чем size_t
.