Perché il libro "The C Programming Language" dice che devo lanciare malloc?


158

Oggi ho raggiunto la pagina 167 di The C Programming Language (seconda edizione Brian W. Kernighan e Dennis M. Ritchie) e ho scoperto che l'autore dice che devo cast malloc. Ecco la parte del libro:

7.8.5 Gestione dell'archiviazione

Le funzioni malloc e calloc ottengono dinamicamente blocchi di memoria.

void *malloc(size_t n)

restituisce un puntatore a n byte di memoria non inizializzata o NULL se la richiesta non può essere soddisfatta.

void *calloc(size_t n, size_t size)

restituisce un puntatore a spazio libero sufficiente per un array di n oggetti della dimensione specificata o NULL se la richiesta non può essere soddisfatta. La memoria è inizializzata a zero. Il puntatore restituito da malloc o calloc ha il corretto allineamento per l'oggetto in questione, ma deve essere inserito nel tipo appropriato, come in

int *ip;
ip = (int *) calloc(n, sizeof(int));

So già che malloc(e la sua famiglia) restituisce il tipo void * , e ci sono buone spiegazioni sul perché non lanciaremalloc .

Ma la mia domanda è: perché il libro dice che dovrei lanciarlo?


125
Perché il libro è vecchio.
Oliver Charlesworth,

12
Perché anche il Sole ha i suoi punti scuri, sarebbe la mia risposta. In altre parole, il libro è sbagliato. È possibile che il testo sia precedente alla semantica void *e non sia stato aggiornato. Vedi anche questa risposta .
Rilassati il

8
@Michi Il libro presenta molti errori fattuali e tipografici (google K&R errata), è solo in qualche modo compatibile con lo standard C90, non affronta l'attuale standard C né eventuali cambiamenti nella lingua dal 1990. Peggio di tutto è pieno di cattiva pratica di programmazione, cattivo stile e codice che si basa su comportamenti poco specificati. Tutto ciò che devi disimparare se diventi un programmatore professionista C.
Lundin,

8
... e contrastalo con Perché il compilatore si lamenta quando non lancio il risultato di malloc? Quindi, per C - non lanciare. Per C ++ - cast, ma non usare mallocperché NON è C ++ - tranne quando devi - ma non dovresti - tranne ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Ripristina Monica il

2
@Mandrill hai letto la mia domanda? Ho dovuto modificare la mia domanda per te.
Michi,

Risposte:


215

Da http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

In pre-ANSI C - come descritto in K & R-1 - malloc () restituiva a char * ed era necessario lanciare il suo valore di ritorno in tutti i casi in cui la variabile ricevente non era anche a char *. Il nuovo void *tipo nella norma C rende superflue queste contorsioni.

Per salvare qualcuno dall'imbarazzo di saltare inutilmente alla difesa di K & R-2, ho chiesto a Dennis Ritchie un'opinione che potrei citare la validità della frase citata sopra da pagina 142. Ha risposto:

In ogni caso, ora che rileggo il materiale a pag. 142, penso che sia sbagliato; è scritto in modo tale da non essere solo difensivo contro le regole precedenti, ma travisa le regole ANSI.


23
Quindi il tipo di ritorno di malloc era char e non nullo . Grazie.
Michi,


18
Non devi leggere questo libro senza quell'errata stampato su un foglio (i) accanto a te.
Lundin,

4
@Michi - no, il tipo di ritorno era char*no char. I due sono molto diversi.
Pete Becker,

20
@alk: esattamente. Leggendo K&R ascolti due guru, il che è ampio ;-)
Steve Jessop,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.