Je reconnais que tous les trois ont une signification différente. Mais, je ne comprends pas dans quels cas particuliers chacun de ces cas s'appliquerait. Quelqu'un peut-il partager un exemple pour chacun d'eux? Je vous remercie.
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
malloc(sizeof(int))
signifie que vous allouez de l'espace sur le tas pour stocker un int
. Vous réservez autant d'octets qu'un int
l'exige. Cela renvoie une valeur que vous devez convertir en Comme certains l'ont noté, la pratique typique en C est de laisser le casting implicite s'en occuper.int *
. (Un pointeur vers un int
.)
malloc(sizeof(int*))
signifie que vous allouez de l'espace sur le tas pour stocker un pointeur sur un int
. Vous réservez autant d'octets qu'un pointeur l'exige. Cela renvoie une valeur que vous devez convertir en un int **
. (Un pointeur vers un pointeur vers un int
.)
(int *)malloc(sizeof(int))
Est exactement le même que le premier appel, mais avec le résultat explicitement casté en un pointeur vers un int
.
Notez que sur de nombreuses architectures, un int
a la même taille qu'un pointeur, donc cela semblera (incorrectement) être la même chose. En d'autres termes, vous pouvez accidentellement faire la mauvaise chose et faire en sorte que le code résultant fonctionne toujours.
Le modèle de syntaxe le plus infaillible est:
int *p;
p = malloc (cnt * sizeof *p);
Cette syntaxe ne vous obligera pas à changer le code si le type (et ou la taille ...) de * p change, par exemple dans
struct mysstruct *q;
q = malloc (cnt * sizeof *q);
Ce qui évitera des problèmes comme
struct mysstruct *z;
z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
, plus: le formulaire sizeof expr
est également plus court.
MISE À JOUR: pour démontrer l'exactitude de p = malloc(CNT * sizeof *p)
ce programme de test:
#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;
}
Qui sort ici:
Sizeof p := 8
Sizeof *p := 20
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...