Sizeof Zeichenfolgenliteral

Der folgende Code

#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; } 

Ausgänge

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

auf einem 32-Bit-Betriebssystem, kompiliert mit GCC.

  1. Warum berechnet sizeof die Länge von (dem für das String-Literal benötigten Platz)?
  2. Hat das Zeichenfolgenliteral einen anderen Typ (von char * oder char []), wenn es an sizeof ?

  1. sizeof("f") muss 2, eins für das ‘f’ und eins für das abschließende ‘\ 0’ zurückgeben.
  2. sizeof(foo) gibt 4 auf einer 32-Bit-Maschine und 8 auf einer 64-Bit-Maschine zurück, weil foo ein pointers ist
  3. sizeof(bar) gibt 2 zurück, weil bar ein Array aus zwei Zeichen ist, dem ‘b’ und dem abschließenden ‘\ 0’.

Das Zeichenfolgenliteral hat den Typ ‘Array der Größe N von char’, wobei N die Terminal-Null enthält.

Denken Sie daran, Arrays zerfallen nicht in pointers, wenn sie an sizeof .

sizeof gibt die Größe seines Operanden in Byte zurück. Das sollte die Frage Nr. 1 beantworten;) Auch ein String-Literal ist vom Typ “array to n const char”, wenn es an sizeof .

Ihre Testfälle, eins nach dem anderen:

  • "f" ist ein String-Literal, das aus zwei Zeichen besteht, dem Zeichen f und dem abschließenden NUL.
  • foo ist ein pointers (edit: unabhängig von Qualifiern) und pointers scheinen auf Ihrem System 4 Byte lang zu sein.
  • Für bar der Fall dasselbe wie "f" .

Ich hoffe, das hilft.