Bevor die Leute anfangen, dies als Dup zu markieren, habe ich Folgendes gelesen, von denen keines die Antwort liefert, nach der ich suche:
- C FAQ: Was ist falsch daran, den Rückgabewert von malloc zu geben?
- SO: Sollte ich den Rückgabewert von malloc () explizit umwandeln?
- SO: Unnötige Zeigerabdrücke in C.
- SO: Werfe ich das Ergebnis von Malloc?
Sowohl die C-FAQ als auch viele Antworten auf die obigen Fragen führen einen mysteriösen Fehler an, mallocden der Rückgabewert des Castings verbergen kann. Keiner von ihnen gibt jedoch ein konkretes Beispiel für einen solchen Fehler in der Praxis. Achten Sie jetzt darauf, dass ich Fehler sagte , nicht Warnung .
Geben Sie nun den folgenden Code ein:
#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;
}
Das Kompilieren des obigen Codes mit gcc 4.2 mit und ohne Umwandlung gibt dieselben Warnungen aus, und das Programm wird ordnungsgemäß ausgeführt und liefert in beiden Fällen dieselben Ergebnisse.
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
Kann jemand ein bestimmtes Codebeispiel für einen Kompilierungs- oder Laufzeitfehler geben, der aufgrund des mallocRückgabewerts des Castings auftreten kann, oder ist dies nur eine urbane Legende?
Bearbeiten Ich bin auf zwei gut geschriebene Argumente zu diesem Thema gestoßen:
- Für das Casting: CERT-Hinweis: Das Ergebnis eines Funktionsaufrufs für die Speicherzuweisung wird sofort in einen Zeiger auf den zugewiesenen Typ umgewandelt
- Gegen Casting (404-Fehler vom 14.02.2012: Verwenden Sie die Internet Archive Wayback Machine- Kopie vom 27.01.2010. {18.03.2016: "Seite kann aufgrund von robots.txt nicht gecrawlt oder angezeigt werden."})
mallocRückgabewerts des Castings : Casting in einen int*64-Bit-Bogen.
Cnicht markiert C++(es handelt sich um zwei verschiedene Sprachen). Daher ist jede Diskussion (wie in einigen Antworten) für diese Frage nicht relevant.
voidZeigern kann der Code als C ++ kompiliert werden. Einige Leute sagen, dass dies eine Funktion ist, ich würde sagen, dass es ein Fehler ist;)