como - malloc char
malloc(sizeof(int)) vs malloc(sizeof(int*)) vs(int*) malloc(sizeof(int)) (2)
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))
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...
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 Como han notado algunos, la práctica típica en C es dejar que la conversión implícita se encargue de esto. int
.)
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.