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