Comprendre sizeof
en C++ : Pourquoi n
n’est-il pas égal à 8
?
Lorsque vous travaillez avec des tableaux en C++, vous pourriez rencontrer des résultats inattendus liés à l’opérateur sizeof
, en particulier lors du passage de tableaux à des fonctions. Dans cet article de blog, nous allons explorer une confusion courante qui se pose lors de l’utilisation de sizeof
avec des paramètres de fonction, en répondant particulièrement à la question : Pourquoi n
n’est-il pas égal à 8
dans la fonction foo()
?
Le Problème
Examinons les deux morceaux de code qui illustrent le problème :
Exemple 1 : Fonction foo()
void foo(char cvalue[8])
{
int n = sizeof(cvalue);
}
Dans l’exemple ci-dessus, lorsque nous appelons sizeof(cvalue)
, vous pourriez vous attendre à ce que n
soit égal à 8
, puisque le tableau est défini avec une taille de 8
. Cependant, ce n’est pas le cas.
Exemple 2 : Fonction bar()
void bar()
{
char cvalue[8];
int n = sizeof(cvalue);
}
Dans ce deuxième exemple, sizeof(cvalue)
est bien égal à 8
. Alors, pourquoi cette différence ?
Comprendre le Concept
Pour comprendre pourquoi sizeof(cvalue)
retourne des valeurs différentes dans chaque fonction, nous devons clarifier comment les tableaux sont traités en C et C++.
Tableaux comme Paramètres de Fonction
Lorsque vous passez un tableau à une fonction en C ou en C++, vous ne passez pas réellement le tableau lui-même. En fait, ce que vous passez est un pointeur vers le premier élément du tableau. Les crochets utilisés dans le paramètre de la fonction ne sont qu’une notation syntaxique, ce qui ne change pas le comportement—les déclarations suivantes sont toutes équivalentes :
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Dans toutes ces déclarations, cvalue
est interprété comme un pointeur. Ainsi, lorsque vous appelez sizeof(cvalue)
à l’intérieur de foo()
, cela vous donne la taille du pointeur, et non la taille du tableau. Sur la plupart des plateformes, cette taille est typiquement de 4
octets sur un système 32 bits et de 8
octets sur un système 64 bits, ce qui explique pourquoi n
n’est pas égal à 8
dans foo()
.
Le Bon Contexte dans bar()
En revanche, à l’intérieur de bar()
, cvalue
est défini comme un tableau local de taille 8
. Par conséquent, lorsque sizeof(cvalue)
est invoqué ici, il reflète correctement la taille de l’ensemble du tableau, ce qui entraîne que n
soit égal à 8
.
Points Clés à Retenir
- Comprendre le Comportement des Pointeurs : Lorsque vous passez des tableaux en tant que paramètres, vous passez en réalité un pointeur, ce qui peut entraîner des valeurs trompeuses lors de l’utilisation de
sizeof
. - Tableaux Locaux :
sizeof
donne la taille réelle des tableaux locaux définis au sein d’une fonction, fournissant la sortie attendue. - Sucre Syntaxique : Les crochets dans les paramètres de fonction ne créent pas de variables de tableau, mais indiquent plutôt que vous gérez un pointeur.
Conclusion
Gérer des tableaux en C et C++ peut être compliqué, en particulier pour ceux qui découvrent le langage. Comprendre la distinction entre pointeurs et tableaux est crucial pour un calcul précis et un débogage efficace. Rappelez-vous que lorsque vous êtes à l’intérieur d’une fonction, sizeof
appliqué à un paramètre supposé être un tableau vous donne la taille du pointeur, et non la taille du tableau que vous aviez l’intention de passer.
En espérant que cette explication éclaire le comportement de l’opérateur sizeof
en relation avec les arguments tableaux dans les fonctions, clarifiant pourquoi n
n’est pas égal à 8
dans la fonction foo()
mais l’est dans bar()
. Gardez ces principes à l’esprit pendant que vous codez !