c pointers casting

¿Debería lanzar explícitamente el valor de retorno de malloc()?



pointers casting (4)

C lanza implícitamente desde y hacia el void* , por lo que el reparto se realizará automáticamente. En C ++, solo la conversión a void* se haría implícitamente, para la otra dirección se requiere un lanzamiento explícito.

Esta pregunta ya tiene una respuesta aquí:

Quería preguntar sobre el siguiente caso:

char *temp; temp = malloc(10);

Como el tipo de devolución de malloc es void* , ¿el puntero devuelto por el malloc convertirá implícitamente en char* type antes de asignarse a temp? ¿Qué dice la norma al respecto?

Si nuestra variable puntero es algún tipo de estructura, por ejemplo:

struct node *temp; temp = (struct node *)malloc(sizeof(struct node));

Si asignamos memoria a temp sin convertirla en struct node* type, ¿se convertirá implícitamente en struct node* type o será necesario convertirlo explícitamente en struct node* type?


En C ++ debe emitir explícitamente, pero este es realmente el lenguaje que le dice que no lo haga.
En c no hay realmente necesidad de lanzar, la memoria es solo memoria: tendré que hacer una búsqueda para ver si el último estándar C lo requiere.


Si te gusta la mentalidad de "no te repites", debería ser atractivo que no necesites repetir el nombre del tipo de la declaración de la variable en la llamada malloc() . Porque, como la gente ha señalado, no lo hace: los punteros se convierten hacia y desde el void * sin pérdida, con la excepción de los punteros de función.

Además, en esa nota, no necesita repetirse con el uso de sizeof tampoco. Su segundo ejemplo, al asignar una estructura, se puede escribir así:

struct node *temp; temp = malloc(sizeof *temp);

Lo cual en mi opinión no tan humilde es la mejor manera.

Evitar la repetición reduce el número de cosas que escribe, lo que a su vez reduce el riesgo de que cualquiera de esas cosas sea incorrecta.

Tenga en cuenta el asterisco en el tamaño del argumento, esto significa "el tamaño del objeto apuntado por este puntero", que es por supuesto el mismo que "el tamaño del tipo struct node ", pero sin repetir el nombre del tipo. Esto se debe a que sizeof calcula (en tiempo de compilación) el tamaño de la expresión que es su argumento. Para este caso. Al igual que sizeof 3 calcula el tamaño de una expresión de tipo int , sizeof *temp calcula el tamaño de una instancia de struct node .

Claro, repite algo , es decir, el nombre de la variable en sí, pero a menudo es una expresión más simple y más fácil de acertar, y también puede ser más fácil para el compilador detectar un error.


Un puntero void en C se puede asignar a cualquier puntero sin un molde explícito.