приведение указателей void

Возможные дубликаты:
Приведу ли результат из malloc?
Должен ли я явно приводить malloc () ' s возвращаемое значение?

Привет,

gcc 4.4.4 c89

Обычно я не передаю результат, возвращаемый вызовом malloc.

int *int_ptr = NULL;
int_ptr = malloc(sizeof(int));

Тем не менее, я читал здесь, что если вы используете кастинг, он может скрыть ошибки. Как он скрывает ошибки, если вы явно приводите к типу int?

int_ptr = (int*)malloc(sizeof(int));

Кроме того, я читал книгу по программированию на c, в которой говорилось, что хорошей практикой программирования является приведение из пустого указателя, включая вызов из malloc.

Что было бы хорошей практикой программирования?

int *int_ptr = NULL;
void *ptr = NULL;

int_ptr = ptr;

or

int_ptr = (int*)ptr;

Большое спасибо за любой совет,


person ant2009    schedule 07.08.2010    source источник
comment
Дубликат? Есть много very похожие вопросы уже.   -  person bcat    schedule 07.08.2010


Ответы (2)


Как он скрывает ошибки, если вы явно приводите к типу int?

Это может скрыть ошибку игнорирования включения stdlib.h перед вызовом malloc. Без правильного объявления функции компилятор C может предположить, что он возвращает int, а явное приведение скроет тот факт, что вы неправильно вызываете malloc. См. Q7.6 и Q7.16 из часто задаваемых вопросов о comp.lang.c.

Кроме того, я читал книгу по программированию на c, в которой говорилось, что хорошей практикой программирования является приведение из пустого указателя, включая вызов из malloc.

Что было бы хорошей практикой программирования?

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

Единственный раз, когда вы должны выполнить явное приведение из void*, - это если вы будете компилировать свой код как C ++, поскольку C ++ не допускает этого как неявное приведение. (Но если вы пишете код на C ++, в этом случае вам следует использовать static_cast.)

person jamesdlin    schedule 07.08.2010
comment
вопрос: следует ли вообще использовать malloc при кодировании на C ++ (но я думаю, что это уже обсуждалось множество раз раньше) - person msi; 07.08.2010
comment
@msiemeri: Обычно этого следует избегать, но если вы взаимодействуете с существующим кодом C, это не всегда вариант. - person jamesdlin; 07.08.2010

Не приводите void* возвращаемое значение malloc(), если это не для того, чтобы GCC работал тихо в вашей среде, или если это требуется коллегами и т. Д.

Приведение или отсутствие приведения, void* - это только адрес памяти. Назначение его переменной с типом придает ему смысл, а отказ от приведения упрощает чтение кода.

person Noah Watkins    schedule 07.08.2010
comment
Что это за вещь, о которой вы говорите? Вы должны иметь в виду void*. - person jamesdlin; 07.08.2010
comment
Хахахаха .... моя поспешность испортила мой пост. Спасибо, это глупо. - person Noah Watkins; 07.08.2010