2015-09-18 10 views
147

Oggi ho raggiunto la pagina di The C Programming Language (second edition Brian W. Kernighan & Dennis M. Ritchie) e ho rilevato che l'autore dice che devo trasmettere malloc. Ecco la parte del libro:Perché il libro dice che devo lanciare malloc?

7.8.5 Storage Management

Le funzioni malloc e calloc ottengono blocchi di memoria in modo dinamico.

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 allo spazio libero sufficiente per una serie di n oggetti delle dimensioni specificate, o NULL se la richiesta non può essere soddisfatta. Lo spazio di archiviazione è inizializzato a zero. Il puntatore restituito da malloc o calloc ha l'allineamento corretto per l'oggetto in questione, ma deve essere gettato nel tipo appropriato, come in

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

so già che malloc (e la sua famiglia) restituisce il tipo vuoto * e there are good explanations why not to cast malloc.

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

+105

Perché il libro è vecchio. –

+9

Perché anche il Sole ha le sue macchie scure, sarebbe la mia risposta. In altre parole, il libro è sbagliato. Potrebbe essere che il testo precede la semantica di 'void *', e non è stato aggiornato. Vedi anche [questa risposta] (http://stackoverflow.com/a/28460192/28169). – unwind

+6

@Michi Il libro ha molti errori fattuali e tipografici (google K & R errata), è solo in qualche modo compatibile con lo standard C90, non si rivolge all'attuale standard C né cambia la lingua dal 1990. Peggio di tutto è pieno con cattiva pratica di programmazione, cattivo stile e codice che si basa su un comportamento scarsamente specificato.Tutto ciò che devi disimparare se diventi un programmatore C professionista. – Lundin

risposta

200

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

In pre-ANSI C - come descritto in K & R-1 - malloc() restituito un char * ed è stato necessario lanciare il suo valore di ritorno in tutti i casi in cui la variabile di ricezione non era anche una char *. Il nuovo tipo void * nello standard C rende superflue queste contorsioni.

Per salvare qualcuno dall'imbarazzo di saltare inutilmente al difesa di K & R-2, ho chiesto Dennis Ritchie per un parere che ho potuto citazione sulla validità della frase citata dalla pagina 142. Egli risposto:

In ogni caso, ora che rileggo il materiale a p. 142, penso che sia sbagliato; è scritto in modo tale che non è solo difensivo contro le regole precedenti, rappresenta erroneamente le regole ANSI.

+19

Quindi il tipo di ritorno di malloc era ** char ** e non ** void ** . Grazie. – Michi

+10

Viene anche menzionato nell'errata http://web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html – nos

+17

Non devi leggere questo libro senza quella errata stampata su una carta (s) accanto a te. – Lundin

Problemi correlati