usar - malloc(sizeof(int)) vs malloc(sizeof(int*)) vs(int*) malloc(sizeof(int))




malloc sizeof (2)

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

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

Esta sintaxis 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 programa de prueba:

#include <stdio.h>
#include <stdlib.h>

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...

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 requiere un int . 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 a la primera llamada, pero con el resultado explícitamente convertido en un puntero a un int .

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





malloc