web-dev-qa-db-fra.com

Sizeof string literal

Le code suivant

#include <iostream>    
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(string literal) = 2
sizeof(const char* const) = 4
sizeof(const char[]) = 2

sur un système d'exploitation 32 bits, compilé avec GCC.

  1. Pourquoi sizeof calcule-t-il la longueur (l'espace nécessaire pour) le littéral de chaîne?
  2. La chaîne littérale a-t-elle un type différent (de char * ou char []) lorsqu'elle est donnée à sizeof?
46
CsTamas
  1. sizeof("f") doit retourner 2, un pour le 'f' et un pour le '\ 0' final.
  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) renvoie 2 car la barre est un tableau de deux caractères, le "b" et le "\ 0" final.

Le littéral de chaîne a le type 'tableau de taille N de char' où N inclut le terminal null.

N'oubliez pas que les tableaux ne se désintègrent pas aux pointeurs lorsqu'ils sont passés à sizeof.

109
Jonathan Leffler

sizeof renvoie la taille en octets de son opérande. Cela devrait répondre à la question numéro 1.;) De plus, un littéral de chaîne est de type "array to n const char" lorsqu'il est passé à 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 le NUL final.
  • foo est un pointeur (modifier: indépendamment des qualificatifs) et les pointeurs semblent faire 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.

13
Michael Foukarakis