Тепер, перш ніж люди починають позначати це дублем, я прочитав усе наступне, жодне з яких не дає відповіді, яку я шукаю:
- C Поширені запитання: Що поганого в литті поверненого значення malloc?
- ТАК: Чи слід явно відтворювати повернене значення malloc ()?
- ТАК: Немає необхідності вказівників на C
- ТАК: Чи я кидаю результат malloc?
Як часто задані запитання C, так і багато відповідей на вищезазначені запитання посилаються на загадкову помилку, яку 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, з приводом і без, дає однакові попередження, і програма виконує належним чином і забезпечує однакові результати в обох випадках.
anon@anon:~/$ 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’
anon@anon:~/$ ./nostdlib_malloc
hello
Тож хтось може навести конкретний приклад коду помилки компіляції або виконання, яка може статися через mallocповернене значення кастингу , чи це просто міська легенда?
Редагувати Я натрапив на два добре написані аргументи щодо цього питання:
- На користь кастингу: Повідомлення щодо CERT: негайно передайте результат виклику функції виділення пам'яті у покажчик на виділений тип
- Проти кастингу (помилка 404 станом на 14.02.2012: скористайтеся копією Інтернет-архіву Wayback Machine від 27.01.2010. {2016-03-18: "Сторінку неможливо просканувати або відобразити через robots.txt."})
voidвказівники лиття дозволяють компілювати код як C ++; дехто каже, що це особливість, я б сказав, що це помилка;)