Я использую результат malloc? - PullRequest
2250 голосов
/ 03 марта 2009

В этот вопрос , кто-то предложил в комментарии , что я должен не привести результат malloc, т. Е.

int *sieve = malloc(sizeof(int) * length);

вместо:

int *sieve = (int *) malloc(sizeof(int) * length);

Почему это так?

Ответы [ 26 ]

11 голосов
/ 29 июня 2016

Я предпочитаю делать приведение, но не вручную. Мой любимый использует макросы g_new и g_new0 от glib. Если glib не используется, я бы добавил похожие макросы. Эти макросы уменьшают дублирование кода без ущерба для безопасности типов. Если вы ошиблись в типе, вы бы получили неявное приведение между не пустыми указателями, что вызвало бы предупреждение (ошибка в C ++). Если вы забудете включить заголовок, который определяет g_new и g_new0, вы получите ошибку. g_new и g_new0 оба принимают одинаковые аргументы, в отличие от malloc, который принимает меньше аргументов, чем calloc. Просто добавьте 0, чтобы получить инициализированную нулями память. Код можно скомпилировать с помощью компилятора C ++ без изменений.

10 голосов
/ 10 сентября 2015

Приведение используется только для C ++, а не для C. В случае, если вы используете компилятор C ++, лучше смените его на компилятор C.

9 голосов
/ 29 июля 2015

Концепция указателя void заключается в том, что он может быть приведен к любому типу данных, поэтому malloc возвращает void. Также вы должны знать об автоматической настройке типов. Так что указывать указатель не обязательно, хотя вы должны это сделать. Это помогает содержать код в чистоте и помогает отладке

6 голосов
/ 08 ноября 2016
  1. Как уже говорилось, это не нужно для C, но для C ++.

  2. Включение преобразования может позволить программе или функции на C компилироваться как C ++.

  3. В C это не нужно, поскольку void * автоматически и безопасно переводится в любой другой тип указателя.

  4. Но если вы разыгрываете то, он может скрыть ошибку, если вы забыли включить stdlib.h . Это может привести к сбоям (или, что еще хуже, не вызвать сбой пока в какой-то совершенно другой части кода).

    Поскольку stdlib.h содержит прототип для malloc, найдено. в Отсутствие прототипа для malloc, стандарт требует, чтобы C Компилятор предполагает, что malloc возвращает int. Если нет актеров, предупреждение выдается, когда это целое число назначено указателю; однако, с использованием приведения это предупреждение не выдается, скрывая ошибку.

6 голосов
/ 18 июля 2016

Пустой указатель является универсальным указателем, и C поддерживает неявное преобразование из типа пустого указателя в другие типы, поэтому нет необходимости явно его типизировать.

Однако, если вы хотите, чтобы один и тот же код работал идеально совместимым на платформе C ++, которая не поддерживает неявное преобразование, вам необходимо выполнить приведение типов, поэтому все зависит от удобства использования.

3 голосов
/ 03 октября 2017

Приведение malloc не нужно в C, но обязательно в C ++.

В C не требуется приведение из-за:

  • void * автоматически и безопасно переводится на любой другой тип указателя в случае C.
  • Может скрыть ошибку, если вы забыли включить <stdlib.h>. Это может вызвать сбои.
  • Если указатели и целые числа имеют разный размер, значит вы скрываете предупреждение путем приведения и можете потерять биты вашего возвращенного адреса.
  • Если тип указателя изменяется при его объявлении, может также потребоваться изменить все строки, где вызывается и malloc, и приводится.

С другой стороны, приведение может увеличить переносимость вашей программы. т.е. он позволяет программе или функции на C компилироваться как C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...