2010-05-22 2 views
2

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?

+1

duplication possible de [recherche de taille de tableau int] (http://stackoverflow.com/questions/2037736/finding-size-of-int-array) –

Répondre

10

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.

+0

"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

+0

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

+0

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. –

0
int bogus1_size = sizeof(bogus1)/sizeof(unsigned char); 
+1

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. –

4

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.

0

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.

+0

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

+0

@William: Peut-être, mais alors il ignorera presque certainement tous les terminateurs NULL, ce qui est inattendu lors de l'impression de chaînes. –

Questions connexes