Taille du littéral de chaîne

Le code suivant

#include  using namespace std; int main() { const char* const foo = "f"; const char bar[] = "b"; cout << "sizeof(string literal) = " << sizeof( "f" ) << endl; cout << "sizeof(const char* const) = " << sizeof( foo ) << endl; cout << "sizeof(const char[]) = " << sizeof( bar ) << endl; } 

les sorties

 sizeof(ssortingng literal) = 2 sizeof(const char* const) = 4 sizeof(const char[]) = 2 

sur un OS 32 bits, compilé avec GCC.

  1. Pourquoi sizeof calcule-t-il la longueur de (l’espace nécessaire pour) le littéral de chaîne?
  2. Le littéral de chaîne a-t-il un type différent (de char * ou char []) lorsqu’il est donné à sizeof ?

    1. sizeof("f") doit renvoyer 2, un pour le “f” et un pour le “\ 0” de fin.
    2. sizeof(foo) renvoie 4 sur une machine 32 bits et 8 sur une machine 64 bits car foo est un pointeur
    3. sizeof(bar) retourne 2 car la barre est un tableau de deux caractères, le ‘b’ et la terminaison ‘\ 0’.

    Le littéral de chaîne a le type ‘array of size N of char’ où N inclut le terminal null.

    Rappelez-vous que les tableaux ne se dégradent pas en pointeurs lorsqu’ils sont transmis à sizeof .

    sizeof renvoie la taille en octets de son opérande. Cela devrait répondre à la question numéro 1.;) En outre, une chaîne littérale est de type “array to n const char” lorsqu’elle est transmise à sizeof .

    Vos cas de test, un par un:

    • "f" est un littéral de chaîne composé de deux caractères, le caractère f et la terminaison NUL.
    • foo est un pointeur (edit: indépendamment des qualificateurs), et les pointeurs semblent avoir 4 octets de long sur votre système.
    • Pour bar le cas est le même que "f" .

    J’espère que cela pourra aider.