Résultat de "sizeof" sur le tableau de struct 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 tiens à 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 est sizeof
simplement pas fiable ici? Si c'est important je suis de la compilation avec GCC 4.4.
- Voir stackoverflow.com/questions/1598773/... pour une réponse qui comprend certains des hacks pour rendre les techniques posté ci-dessous, plus de sécurité.
Vous devez vous connecter pour publier un commentaire.
C'est une constante de compilation, de sorte que vous pouvez l'utiliser pour, par exemple, de créer un autre tableau:
struct
.extern
(bien qu'il n'est pas le cas dans la question d'origine). Le compilateur ne serait pas en mesure de déterminer la sizeof(a) au moment de la compilation, si elle est déclarée dans un autre fichier source.sizeof
vous donne la taille en octets, et non pas le nombre d'éléments. Comme Alok dit, pour obtenir le nombre d'éléments, de diviser la taille en octets du tableau par la taille en octets d'un élément. Le bon C idiome est:sizeof a / sizeof *a
sizeof
retourne la taille en mémoire de l'élément passé. En divisant la taille d'un tableau en une seule taille de l'élément, vous obtenez les éléments de comptage.Noter que la taille de l'élément peuvent inclure des octets de remplissage ainsi. Pour cette raison, un collier de struct (par exemple, quand un char membre est suivie par un pointeur) aura un
sizeof
valeur plus grande que les membres de la taille de la somme.D'autre part, ne vous en faites pas pour le comptage d'éléments dans un tableau:
sizeof(a) /sizeof(a[0])
fonctionne toujours aussi lisse que prévu.