web-dev-qa-db-fra.com

Résultat de 'sizeof' sur un tableau de structures en C?

En C, j'ai un tableau de structures définies comme:

struct D
{
    char *a;
    char *b;
    char *c;
};

static struct D a[] = {
    {
        "1a",
        "1b",
        "1c"
    },
    {
        "2a",
        "2b",
        "2c"
    }
};

Je voudrais déterminer le nombre d'éléments dans le tableau, mais sizeof(a) renvoie un résultat incorrect: 48, pas 2. Suis-je en train de faire quelque chose de mal, ou sizeof est-il simplement peu fiable ici? Si cela importe, je compile avec GCC 4.4.

30
Joseph Piche
sizeof a / sizeof a[0];

Il s'agit d'une constante de compilation, vous pouvez donc l'utiliser pour, par exemple, créer un autre tableau:

#define N sizeof a / sizeof a[0]
int n_a[N];
36
Alok Singhal

sizeof vous donne la taille en octets, pas le nombre d'éléments. Comme le dit Alok, pour obtenir le nombre d'éléments, divisez la taille en octets du tableau par la taille en octets d'un élément. L'idiome C correct est:

sizeof a / sizeof a[0]
45
Grandpa

sizeof renvoie la taille en mémoire de l'élément passé. En divisant la taille d'un tableau par une seule taille d'élément, vous obtenez le nombre d'éléments.

Notez que la taille de l'élément peut également inclure des octets de remplissage. Pour cette raison, une structure complétée (par exemple lorsqu'un membre char est suivi d'un pointeur) aura une valeur sizeof supérieure à la somme de la taille de ses membres.

D'un autre côté, ne vous inquiétez pas lorsque vous comptez des éléments dans un tableau: sizeof(a) / sizeof(a[0]) fonctionnera toujours aussi bien que prévu.

10
ittays