Comment puis-je connaître la légèreté d’un tableau en C ++

Dupliquer possible:
Taille d’un tableau dans le langage de programmation C?

J’ai un tableau de caractères et je veux le traiter dans une fonction, j’ai essayé le code comme ceci:

int main(){ char *word = new char [5]; /*here we make this word .... */ process(word); puts(word); } void process(char *word){ int sizeOfWord = sizeof(word)-1; /* here is cycle that process the word, I need it lenght to know how long cycle must be ..... */ } 

Mais je ne peux pas obtenir la longueur d’un tableau avec sizeof . Pourquoi? Et comment puis-je l’obtenir?

Tu ne peux pas. Avec un pointeur, il n’ya aucun moyen de connaître la taille.

Ce que vous devriez faire, c’est aussi transmettre la longueur du word à votre process .


Vous devez savoir qu’il existe une différence entre les tableaux et les pointeurs. Les tableaux sont en effet un certain nombre d’éléments et donc la taille du tableau donne sa taille (en octets). Un pointeur par contre n’est qu’une adresse. Il se peut même qu’il ne pointe pas vers un tableau. Étant donné que l’opérateur sizeof est calculé au moment de la compilation (à l’exception des tableaux de longueur variable), il ne peut pas savoir ce que vous voulez dire.

Pensez à cet exemple:

 void process(char *word); int main(){ char *word = new char [5]; char *word2 = new char [10]; process(word); process(word2); /* ... */ } void process(char *word){ int sizeOfWord = sizeof(word)-1; // what should this be? /* ... */ } 

Maintenant, sachant que la sizeof de ce cas est calculée au moment de la compilation, quelle valeur pensez-vous qu’elle devrait obtenir? 5 ? 10 ?


Note latérale: Il semble que vous utilisiez ce tableau comme une chaîne. Dans ce cas, vous pouvez facilement obtenir sa longueur avec strlen .

U devrait utiliser strlen() place.

EDIT : En supposant que votre word est un mot valide avec \0 à la fin.

Quoi qu’il en soit, vous utilisez c++ , vous devez donc utiliser un conteneur tel que std::ssortingng .

Si votre tableau est toujours char* ou const char* et contient des chaînes terminées par null, vous pouvez utiliser strlen , ou même plus facilement utiliser la classe std::ssortingng et ses méthodes appropriées.

Si ce n’est pas une chaîne terminée par un zéro (par exemple, c’est un tableau d’octets simples, ou si votre question concerne les tableaux en général et que le caractère n’était qu’un exemple), utilisez std::vector ou std::array et appelez leurs méthodes .size() .

Comme les tableaux “se désintègrent” en pointeurs vers leurs premiers éléments de code, vous ne le pouvez pas. Le pointeur ne “sait” pas à quel point un bloc de mémoire est pointé. Vous devez passer la taille séparément, par exemple

 void process(char *word, size_t length); 

Il n’y a qu’un moyen de connaître la longueur d’un tableau en C / C ++: le savoir déjà. Vous devrez passer la longueur du tableau en tant que paramètre supplémentaire.

Si vous parlez spécifiquement de chaînes, recherchez le caractère null dans le tableau, puis utilisez son index + 1 comme longueur (ce qui est fondamentalement ce que fait la fonction strlen ()).

Sinon, vous pourriez peut-être simplement utiliser std :: ssortingng à la place, puis obtenir la propriété length?

Vous devez soit passer la longueur du tableau à la fonction de process , soit utiliser le caractère nul ( \0 ) pour marquer la fin.

En supposant que ce dernier soit utilisable

 void process(char *word) { while (*word) { //do stuff with the character *word ++word; } } 

Non, ça ne marchera pas. sizeof un pointeur ne renvoie que la taille du type de pointeur, pas celle du tableau. Lorsque vous transmettez un tableau en tant que paramètre à une fonction, le tableau se décompose en un pointeur, ce qui signifie que le compilateur ne saura plus exactement à quoi il pointe exactement et si c’est un tableau, combien de temps il peut durer. La seule façon pour vous de le savoir à l’intérieur de la fonction est

  • passer la longueur en tant que paramètre supplémentaire, ou
  • ajoutez un élément de terminaison supplémentaire au tableau.

Notez que les tableaux en C et C ++ ne stockent pas leur taille de quelque manière que ce soit, c’est donc le programmeur qui doit en tenir compte et programmer en conséquence. Dans le code ci-dessus, vous savez que la taille réelle de a est 5, mais le compilateur (et le moteur d’exécution) n’a aucun moyen de le savoir. Si vous l’avez déclaré comme un tableau, c’est à dire

 char[] word = new char [5]; 

le compilateur garderait trace de sa taille, et sizeof renverrait cette taille (en octets) tant qu’il serait dans la scope de cette déclaration. Cela permet d’appliquer un idiome bien connu pour obtenir la taille réelle d’un tableau:

 int size = sizeof(a) / sizeof(char); 

Mais encore une fois, cela ne fonctionne que tant que le compilateur sait qu’il s’agit bien d’un tableau, il n’est donc pas possible à l’intérieur des appels de fonction où a est passé en tant que paramètre (pointeur).

Sous Windows, la fonction _msize permet d’obtenir la taille de la mémoire allouée sur le tas en octets. Dans VS2005 et VS2008, cela fonctionnait parfaitement avec l’opérateur new , car il utilisait malloc pour allouer la mémoire. Je dois noter:

Ce n’est pas une méthode standard, vous ne devez donc PAS l’utiliser!

 Object * addr = new Object[xxx]; size_t number_of_objects = _msize(addr) / sizeof(Object); 

Les autres réponses ont expliqué en détail pourquoi vous ne pouvez pas obtenir la taille d’un tableau C classique, mais je tiens à souligner ce qui suit.

Votre exemple manque un

 delete [] word; 

à la fin de la main. Sinon, vous avez une fuite de mémoire.

Cela montre pourquoi la façon préférée de travailler avec des tableaux en C ++ est d’utiliser std::vector ou – dans le cas d’une longueur fixe – le nouveau std::array et en cas de chaînes de caractères std::ssortingng . Le compilateur gérera le stockage sous-jacent pour vous. Toutes ces classes fournissent une fonction de size .