Zanim ludzie zaczną oznaczać to dupkiem, przeczytałem wszystkie poniższe rzeczy, z których żadna nie dostarcza odpowiedzi, której szukam:
- C FAQ: Co jest złego w rzutowaniu wartości zwracanej przez malloc?
- SO: Czy powinienem jawnie rzutować wartość zwracaną przez malloc ()?
- SO: niepotrzebne rzutowanie wskaźnika w C
- SO: Czy mogę rzucić wynik malloc?
Zarówno C FAQ, jak i wiele odpowiedzi na powyższe pytania cytuje tajemniczy błąd, który mallocmoże ukryć wartość zwracana przez rzutowanie ; jednak żaden z nich nie podaje konkretnego przykładu takiego błędu w praktyce. Teraz zwróć uwagę, że powiedziałem błąd , a nie ostrzeżenie .
Teraz otrzymałem następujący kod:
#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;
}
Kompilowanie powyższego kodu za pomocą gcc 4.2, z rzutowaniem i bez, daje te same ostrzeżenia, a program działa poprawnie i zapewnia te same wyniki w obu przypadkach.
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
Czy zatem ktoś może podać konkretny przykład kodu błędu kompilacji lub wykonania, który może wystąpić z powodu mallocwartości zwracanej rzutowania , czy jest to tylko miejska legenda?
Edytuj Natknąłem się na dwa dobrze napisane argumenty dotyczące tej kwestii:
- Za rzutowaniem : CERT Advisory: Natychmiast rzutowanie wyniku wywołania funkcji alokacji pamięci na wskaźnik do przydzielonego typu
- Przeciwko przesyłaniu (błąd 404 z 14.02.2012: użyj kopii Internet Archive Wayback Machine z 27.01.2010. {2016-03-18: "Strona nie może zostać zaindeksowana lub wyświetlona z powodu pliku robots.txt."})
voidwskaźników pozwala skompilować kod w C ++; niektórzy mówią, że to funkcja, powiedziałbym, że to błąd;)