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 !