¿Por qué el libro "El lenguaje de programación C" dice que debo lanzar malloc?

158

Hoy llegué a la página 167 de The C Programming Language (segunda edición, Brian W. Kernighan y Dennis M. Ritchie) y descubrí que el autor dice que debo emitir malloc. Aquí está la parte del libro:

7.8.5 Gestión de almacenamiento

Las funciones malloc y calloc obtienen bloques de memoria dinámicamente.

void *malloc(size_t n)

devuelve un puntero a n bytes de almacenamiento no inicializado, o NULL si no se puede satisfacer la solicitud.

void *calloc(size_t n, size_t size)

devuelve un puntero a suficiente espacio libre para una matriz de n objetos del tamaño especificado, o NULL si no se puede satisfacer la solicitud. El almacenamiento se inicializa a cero. El puntero devuelto por malloc o calloc tiene la alineación adecuada para el objeto en cuestión, pero debe convertirse en el tipo apropiado, como en

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

Ya sé que malloc(y su familia) devuelve type void * , y hay buenas explicaciones de por qué no emitirmalloc .

Pero mi pregunta es: ¿por qué el libro dice que debería lanzarlo?

Michi
fuente
125
Porque el libro es viejo.
Oliver Charlesworth
12
Porque incluso el Sol tiene sus puntos oscuros, sería mi respuesta. En otras palabras, el libro está equivocado. Puede ser que el texto sea anterior a la semántica void *y no se haya actualizado. Ver también esta respuesta .
relajarse el
8
@Michi El libro tiene muchos errores fácticos y tipográficos (erratas de Google K&R), solo es algo compatible con el estándar C90, no aborda el estándar C actual ni ningún cambio en el lenguaje desde 1990. Lo peor de todo está lleno de mala práctica de programación, mal estilo y código que se basa en un comportamiento mal especificado. Todo lo cual tienes que desaprender si te conviertes en un programador profesional de C.
Lundin
8
... y contrasta esto con ¿Por qué el compilador se queja cuando no lanzo el resultado de malloc? Entonces, para C, no lances. Para C ++ - cast, pero no lo use mallocporque NO es C ++ - excepto cuando tiene que hacerlo, pero no debe hacerlo - excepto ... :-)
Bob Jarvis - Restablece a Monica el
2
@Mandrill, ¿has leído mi pregunta? Tuve que editar mi pregunta por ti.
Michi

Respuestas:

215

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

En pre-ANSI C, como se describe en K & R-1, malloc () devolvió a char * y fue necesario emitir su valor de retorno en todos los casos en que la variable receptora no era también a char *. El nuevo void *tipo en el Estándar C hace que estas contorsiones sean innecesarias.

Para salvar a cualquiera de la vergüenza de saltar innecesariamente a la defensa de K & R-2, le pedí a Dennis Ritchie una opinión que pudiera citar sobre la validez de la oración citada anteriormente en la página 142. Él respondió:

En cualquier caso, ahora que releí las cosas en la pág. 142, creo que está mal; está escrito de tal manera que no solo es defensivo contra las reglas anteriores, sino que tergiversa las reglas ANSI.

David Ranieri
fuente
23
Entonces, el tipo de retorno de malloc era char y no nulo . Gracias.
Michi
18
No debe leer este libro sin esa errata impresa en un papel a su lado.
Lundin
44
@Michi: no, el tipo de retorno era char*, no char. Los dos son muy diferentes.
Pete Becker
20
@alk: exactamente. Al leer K&R estás escuchando a dos gurús, lo cual es amplio ;-)
Steve Jessop