web-dev-qa-db-fra.com

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

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))
21
sabergeek

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 int *. (Un pointeur vers un int.) Comme certains l'ont noté, la pratique typique en C est de laisser le casting implicite s'en occuper.

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.

42
Steven Burnap

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