Maintenant, avant que les gens ne commencent à marquer cela comme un dup, j'ai lu tout ce qui suit, dont aucun ne fournit la réponse que je recherche:
- C FAQ: Quel est le problème avec la conversion de la valeur de retour de malloc?
- SO: Dois-je convertir explicitement la valeur de retour de malloc ()?
- SO: Inutile de lancer des pointeurs en C
- SO: Est-ce que je lance le résultat de malloc?
La FAQ C et de nombreuses réponses aux questions ci-dessus citent une erreur mystérieuse que malloc
la valeur de retour du casting peut masquer; cependant, aucun d'entre eux ne donne un exemple précis d'une telle erreur dans la pratique. Maintenant, faites attention que j'ai dit erreur , pas d' avertissement .
Maintenant donné le code suivant:
#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;
}
Compiler le code ci-dessus avec gcc 4.2, avec et sans le cast donne les mêmes avertissements, et le programme s'exécute correctement et fournit les mêmes résultats dans les deux cas.
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
Quelqu'un peut - il donner un exemple de code spécifique d 'une erreur de compilation ou d' exécution qui pourrait se produire en raison de malloc
la valeur de retour de la conversion, ou est - ce juste une légende urbaine?
Edit Je suis tombé sur deux arguments bien écrits concernant ce problème:
- En faveur de la diffusion: Avis CERT: convertir immédiatement le résultat d'un appel de fonction d'allocation de mémoire en un pointeur vers le type alloué
- Contre la diffusion (erreur 404 du 14/02/2012: utilisez la copie Internet Archive Wayback Machine du 27/01/2010. {18/03/2016: "La page ne peut pas être explorée ou affichée en raison du fichier robots.txt."})
void
pointeurs permet de compiler le code en C ++; certaines personnes disent que c'est une fonctionnalité, je dirais que c'est un bug;)