¿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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.