En C++ donné un tableau comme celui-ci:Existe-t-il un moyen d'introspecter la taille d'un tableau?
unsigned char bogus1[] = {
0x2e, 0x2e, 0x2e, 0x2e
};
est-il un moyen de introspect bogus1 pour savoir est est quatre caractères?
En C++ donné un tableau comme celui-ci:Existe-t-il un moyen d'introspecter la taille d'un tableau?
unsigned char bogus1[] = {
0x2e, 0x2e, 0x2e, 0x2e
};
est-il un moyen de introspect bogus1 pour savoir est est quatre caractères?
Bien sûr:
#include <iostream>
int main()
{
unsigned char bogus1[] = {
0x2e, 0x2e, 0x2e, 0x2e
};
std::cout << sizeof(bogus1) << std::endl;
return 0;
}
émet 4
. Plus généralement, sizeof(thearray)/sizeof(thearray[0])
est le nombre d'éléments dans le tableau. Cependant, il s'agit d'une opération de compilation et ne peut être utilisée que si le compilateur connaît à propos de ce "nombre d'éléments" (pas, par exemple, dans une fonction recevant le tableau en tant qu'argument). Pour plus de généralité, vous pouvez utiliser std::vector
au lieu d'un tableau vide.
"une fonction recevant le tableau en tant qu'argument" - attention, cela doit être un argument * reference *. Le nommage d'un type de tableau directement dans une déclaration d'argument entraîne le type decay to pointer, ce qui entraîne un comportement indésirable du quotient sizeof. – Potatoswatter
Donc, si je fais "std :: clog << bogus1;" pourquoi ne peut pas std :: clog détecter le tableau est seulement quatre caractères et ne pas marcher sur la fin du tableau à la recherche d'un char NULL? – WilliamKF
WilliamKF: parce que c'est inutile: vous devriez simplement utiliser std :: string à la place. Les rares cas où vous connaissez la longueur d'une chaîne à compiletime ne valent pas la complexité ajoutée que vous proposez. –
int bogus1_size = sizeof(bogus1)/sizeof(unsigned char);
Je recommande d'écrire cela comme 'sizeof (bogus1)/sizeof (bogus1 [0]) '; De cette façon, il n'y a aucune chance que vous ayez accidentellement un type différent entre la définition de 'bogus1' et votre calcul de taille. –
Une chose à faire attention à avec sizeof
fait que vous ne faites pas accidentellement le sizeof un tableau qui a décru en un pointeur:
void bad(int a[10])
{
cout << (sizeof(a)/sizeof(a[0])) << endl;
}
int main()
{
int a[10];
cout << (sizeof(a)/sizeof(a[0])) << endl;
bad(a);
}
Sur ma machine 64 bits, cette sortie:
10
2
La taille calculée à l'intérieur de bad
est incorrecte car a
est tombé en pointeur. En général, ne faites pas confiance au sizeof
un tableau qui a été passé en tant qu'argument de fonction.
Cela contourne le problème de décroissance du pointeur:
#include <cstddef>
template<typename T, std::size_t N>
std::size_t array_size(T(&)[N]) { return N; }
en ce sens qu'il ne compilera pas à moins de connaître la taille du tableau.
Oui, il semble que par l'utilisation de modèles, std :: stringstream pourrait apprendre la longueur du tableau et ne pas quitter la fin. – WilliamKF
@William: Peut-être, mais alors il ignorera presque certainement tous les terminateurs NULL, ce qui est inattendu lors de l'impression de chaînes. –
duplication possible de [recherche de taille de tableau int] (http://stackoverflow.com/questions/2037736/finding-size-of-int-array) –