Ora, prima che le persone inizino a contrassegnarlo come un duplice, ho letto tutto quanto segue, nessuno dei quali fornisce la risposta che sto cercando:
- C FAQ: Cosa c'è di sbagliato nel lanciare il valore di ritorno di malloc?
- COSÌ: Devo lanciare esplicitamente il valore di ritorno di malloc ()?
- COSÌ: inutili lanci di puntatori in C
- SO: lancio il risultato di malloc?
Sia la C FAQ che molte risposte alle domande precedenti citano un misterioso errore che mallocil valore di ritorno del casting può nascondere; tuttavia, nessuno di essi fornisce un esempio specifico di tale errore nella pratica. Ora fai attenzione che ho detto errore , non avviso .
Ora dato il seguente codice:
#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;
}
La compilazione del codice precedente con gcc 4.2, con e senza il cast, fornisce gli stessi avvertimenti e il programma viene eseguito correttamente e fornisce gli stessi risultati in entrambi i casi.
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
Quindi chiunque può fornire un esempio di codice specifico di un errore di compilazione o di runtime che potrebbe verificarsi a causa del mallocvalore di ritorno del casting , o è solo una leggenda metropolitana?
Modifica Mi sono imbattuto in due argomenti ben scritti riguardo a questo problema:
- A favore del cast: Avviso CERT: cast immediatamente il risultato di una chiamata alla funzione di allocazione della memoria in un puntatore al tipo allocato
- Contro la trasmissione (errore 404 a partire dal 14/02/2012: utilizza la copia Internet Archive Wayback Machine del 27/01/2010. {18/03/2016: "Impossibile eseguire la scansione o la visualizzazione della pagina a causa di robots.txt."})
voidpointers permette di compilare il codice come C ++; alcune persone dicono che è una caratteristica, direi che è un bug;)