Puntero de función emitido en la declaración
Frecuentes
Visto 174 equipos
2
Mientras buscaba información sobre calloc, encontré en el código fuente:
char *malloc();
en la función calloc.
¿Arroja el vacío *malloc(size_t) en un puntero de función que devuelve un char*?
Esta sintaxis no compila para mí.
2 Respuestas
4
En los viejos tiempos, antes ANSI C proporciona un void *
como el tipo de puntero genérico, char *
se utilizó para este propósito.
El código es de la fuente de Versión 7 Unix, se lanza en 1979 (antes ANSI C).
Y esta es la razón es necesario emitir el valor de retorno de malloc()
en el antiguo código pre-ANSI.
Referencia: C Preguntas frecuentes
contestado el 23 de mayo de 17 a las 13:05
3
Eso es de un código fuente muy antiguo. Está viendo el código de la versión 7 de UNIX, que se lanzó en 1979. El lenguaje C ha cambiado sustancialmente desde entonces.
No es un yeso; es una declaración de función. Una conversión consta de un nombre de tipo entre paréntesis seguido de una expresión, como (int)foo
.
Además, es un viejo estilo declaración de función, un no-prototipo que no especifica los tipos de los parámetros. (Sin embargo, sigue siendo una sintaxis válida).
declara que malloc
es una función que devuelve un resultado de tipo char*
. (No lo hace definir al malloc
función; eso hay que hacerlo en otro lado).
En C moderno (desde 1989), malloc
devolver un resultado de tipo void*
y tiene un único parámetro de tipo size_t
, por lo que la declaración sería:
void *malloc(size_t);
pero esa declaración es proporcionada por el estándar <stdlib.h>
encabezado, por lo que no es necesario que proporcione la declaración usted mismo.
Es legal tener declaraciones de funciones dentro de otras funciones, pero rara vez es una idea particularmente buena.
Respondido 14 Feb 14, 02:02
¡Gracias! Ok si char *malloc(); no es un prototipo para la declaración de funciones. Malloc ya ha sido un char *malloc(size_t) incluso en 1979. ¿Por qué un char *malloc() podría compilar sin conflictos? - nsvir
@nsvir: En 1979, void
no existía; ese código se habría compilado sin error en el entorno para el que fue escrito. A partir de 1989, la declaración es void *malloc(size_t);
. Una declaración que es inconsistente con eso aún podría compilarse si la declaración correcta no está visible. La redefinición de las funciones de la biblioteca estándar tiene un comportamiento indefinido, pero el código que está viendo formaba parte de la propia biblioteca estándar. - Keith Thompson
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c pointers malloc function-pointers or haz tu propia pregunta.
Creo que es la versión de DEC de la versión 7 UNIX del V7M al comienzo de la ruta. Sugiere en la siguiente línea que compare esto con el equivalente de 4.2 BSD. Pero de cualquier manera, ciertamente es muy viejo. - nigel harper
¡Gracias! ¿Hay una versión más nueva? Quiero decir, legible, porque glibc/malloc.c es muy difícil de entender. - nsvir
@nsvir: No existe una única versión actual de la implementación de la biblioteca estándar de C. El estándar C solo especifica los nombres de los encabezados, las declaraciones de funciones, etc. Hay varias implementaciones diferentes, de las cuales glibc es probablemente la más popular. (El código de la biblioteca tiende a optimizarse para otros factores además de la legibilidad). - Keith Thompson