malloc (sizeof (int)) vs malloc (sizeof (int *)) vs (int *) malloc (sizeof (int))

Reconozco que los tres tienen un significado diferente. Pero, no entiendo en qué casos particulares se aplicaría cada uno de estos. ¿Alguien puede compartir un ejemplo para cada uno de estos? Gracias.

malloc(sizeof(int)) malloc(sizeof(int *)) (int *)malloc(sizeof(int)) 

malloc(sizeof(int)) significa que está asignando espacio del montón para almacenar un int . Usted está reservando tantos bytes como un int requiere. Esto devuelve un valor que debe convertir a int * . (Un puntero a un int .) Como han notado algunos, la práctica típica en C es dejar que la conversión implícita se encargue de esto.

malloc(sizeof(int*)) significa que está asignando espacio fuera del montón para almacenar un puntero a un int . Usted está reservando tantos bytes como requiere un puntero. Esto devuelve un valor que debe convertir a un int ** . (Un puntero a un puntero a un int .)

(int *)malloc(sizeof(int)) es exactamente igual que la primera llamada, pero con el resultado explícitamente convertido en un puntero a un int .

Tenga en cuenta que en muchas architectures, un int es del mismo tamaño que un puntero, por lo que estas (incorrectamente) parecerán ser lo mismo. En otras palabras, puede hacer algo incorrecto accidentalmente y hacer que el código resultante aún funcione.

El patrón de syntax más infalible es:

  int *p; p = malloc (cnt * sizeof *p); 

Esta syntax no lo obligará a cambiar el código si el tipo (y / o tamaño …) de * p cambia, por ejemplo, en

  struct mysstruct *q; q = malloc (cnt * sizeof *q); 

Lo que evitará problemas como

 struct mysstruct *z; z = malloc (cnt * sizeof(struct hisstruct)); // Auch! 

, además: la forma sizeof expr también es más corta.


ACTUALIZACIÓN: para demostrar la corrección de p = malloc(CNT * sizeof *p) este progtwig de prueba:

 #include  #include  struct mystruct { int i; char s[14]; }; int main(void) { struct mystruct *p; size_t siz; siz = sizeof p; printf("Sizeof p := %zu\n", siz); siz = sizeof *p; printf("Sizeof *p := %zu\n", siz); printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n" , 10u * sizeof *p , 10u, sizeof *p ); p = malloc(10 * sizeof *p); return 0; } 

Qué salidas aquí:

 Sizeof p := 8 Sizeof *p := 20 Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...