Теперь, прежде чем люди начнут отмечать этот дубликат, я прочитал все следующее, ни один из которых не дает ответ, который я ищу:
- C Часто задаваемые вопросы: Что не так с литьем возвращаемого значения malloc?
- SO: Должен ли я явно указывать возвращаемое значение malloc() s?
- SO: ненужные указатели в C
- SO: Я делаю результат malloc?
Как в C-FAQ, так и во многих ответах на вышеупомянутые вопросы указывается таинственная ошибка, которая может скрыть возвращаемое значение malloc
; однако ни один из них не дает конкретного примера такой ошибки на практике. Теперь обратите внимание, что я сказал ошибка, а не предупреждение.
Теперь дается следующий код:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Компиляция вышеуказанного кода с помощью gcc 4.2 с и без приведения дает те же предупреждения, и программа выполняется должным образом и дает те же результаты в обоих случаях.
[email protected]:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
[email protected]:~/$ ./nostdlib_malloc
hello
Так может ли кто-нибудь дать конкретный пример кода ошибки компиляции или времени выполнения, которая может возникнуть из-за литья возвращаемого значения malloc
, или это просто городская легенда?
Изменить Я столкнулся с двумя хорошо написанными аргументами в отношении этой проблемы:
- В пользу кастинга: CERT Advisory: Сразу же вывести результат вызова функции выделения памяти в указатель на выделенный тип
- Против кастинга (ошибка 404 на 2012-02-14: используйте Internet Archive Wayback Machine копировать с 2010-01-27. {2016-03-18: "Страница не может сканироваться или отображаться из-за robots.txt." })