Por que o livro “The C Programming Language” diz que devo lançar malloc?

158

Hoje, cheguei à página 167 de The C Programming Language (segunda edição, Brian W. Kernighan e Dennis M. Ritchie) e descobri que o autor diz que devo transmitir malloc. Aqui está a parte do livro:

7.8.5 Gerenciamento de armazenamento

As funções malloc e calloc obtêm blocos de memória dinamicamente.

void *malloc(size_t n)

retorna um ponteiro para n bytes de armazenamento não inicializado ou NULL se a solicitação não puder ser atendida.

void *calloc(size_t n, size_t size)

retorna um ponteiro para espaço livre suficiente para uma matriz de n objetos do tamanho especificado ou NULL se a solicitação não puder ser atendida. O armazenamento é inicializado em zero. O ponteiro retornado por malloc ou calloc possui o alinhamento adequado para o objeto em questão, mas deve ser convertido no tipo apropriado, como em

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

Eu já sei que malloc(e sua família) retorna o tipo void * , e há boas explicações por que não lançarmalloc .

Mas minha pergunta é: por que o livro diz que devo lançá-lo?

Michi
fonte
125
Porque o livro é antigo.
Oliver Charlesworth
12
Porque até o Sol tem manchas escuras, seria a minha resposta. Em outras palavras, o livro está errado. Pode ser que o texto anteceda a semântica void *e não tenha sido atualizado. Veja também esta resposta .
descontraia
8
@Michi O livro tem muitos erros factuais e tipográficos (Google K&R errata), é apenas um pouco compatível com o padrão C90, não aborda o padrão C atual nem qualquer alteração no idioma desde 1990. O pior de tudo é que ele é preenchido com má prática de programação, mau estilo e código que se baseia em comportamentos mal especificados. Tudo o que você precisa desaprender se se tornar um programador profissional em C.
Lundin
8
... e compare isso com Por que o compilador reclama quando eu não transmito o resultado do malloc? Então, para C - não faça elenco. Para C ++ - elenco, mas não use mallocporque NÃO é C ++ - exceto quando você precisa - mas você não deveria - exceto ... AGGGHHHHHHH !!!!! :-)
Bob Jarvis - Restabelece Monica
2
@ Mandrill você leu minha pergunta? Eu tive que editar minha pergunta para você.
Michi

Respostas:

215

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

No pré-ANSI C - como descrito em K & R-1 - malloc () retornou a char * e foi necessário converter seu valor de retorno em todos os casos em que a variável receptora também não era a char *. O novo void *tipo no Padrão C torna essas contorções desnecessárias.

Para salvar alguém do constrangimento de pular desnecessariamente em defesa do K & R-2, pedi a Dennis Ritchie uma opinião que pudesse citar sobre a validade da sentença citada acima na página 142. Ele respondeu:

De qualquer forma, agora que reli as coisas na p. 142, acho que está errado; está escrito de tal maneira que não é apenas defensivo contra regras anteriores, mas deturpa as regras ANSI.

David Ranieri
fonte
23
Portanto, o tipo de retorno de malloc era char e não era nulo . Obrigado.
18715 Michi
18
Você não deve ler este livro sem as erratas impressas nos papéis próximos a você.
Lundin
4
@ Michi - não, o tipo de retorno era char*, não char. Os dois são muito diferentes.
Pete Becker
20
@alk: exatamente. Ao ler K & R que você está ouvindo dois gurus, que é amplo ;-)
Steve Jessop