2009-09-08 7 views
39

następujący kodsizeof ciąg dosłowne

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

wyjścia

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

na 32bit OS, skompilowane z GCC.

  1. Dlaczego sizeof oblicza długość (wymaganego miejsca) ciągu literowego?
  2. Czy literał ciągów znaków ma inny typ (od char * lub char []), gdy podano go pod sizeof?

Odpowiedz

89
  1. sizeof("f") musi zwrócić 2, jeden dla "f" i jeden dla zakończenia "\ 0".
  2. sizeof(foo) powraca 4 na urządzeniu 32-bitowym i 8 na maszynie 64-bitowe, ponieważ foo wskaźnik
  3. sizeof(bar) powraca 2, ponieważ pasek jest tablicą dwóch znaków, „b” i kończącego „\ 0 ".

Literał łańcuchowy ma typ "tablica o rozmiarze N znaku" gdzie N zawiera terminal zerowy.

Pamiętaj, że tablice nie ulegają rozpadowi na wskaźniki po przejściu do sizeof.

+9

+1, ale typ jest właściwie tablicą znaków N const (const nie jest opcjonalna) –

+4

@dribeas: yes; Ignorowałem kwalifikatory, ale jesteś pedantycznie poprawny. –

+11

@ JonathanLeffler ... najlepszy rodzaj poprawności, szczególnie jeśli chodzi o programowanie –

11

sizeof zwraca rozmiar w bajtach swojego operandu. To powinno odpowiedzieć na pytanie numer 1.;) Ponadto literał łańcuchowy jest typu "array to n const char" po przekazaniu do sizeof.

Twoje przypadki testowe, jeden po drugim:

  • "f" jest ciągiem dosłowne składający dwa znaki, postać f a kończące NULL.
  • foo jest wskaźnik (edit: niezależnie od kwalifikacyjnych) oraz wskaźniki wydają się być 4 bajty długo na komputerze ..
  • Dla bar sprawa jest taka sama jak "f".

Nadzieję, że pomaga.

+0

Dlaczego jednak "char []" jest taki sam jak literał striong? Nie jestem ekspertem C/C++, ale myślałem, że 'char []' i 'char *' były wymienne? –

+0

+1 na ogólną odpowiedź (i dla prędkości :) Kilka dokładności: foo JEST wskaźnikiem (w zasadzie kwalifikator nie ma zastosowania) iw C++ typ jest zawsze "tablicą n const char" (stała-ność nie jest opcjonalna) –

+0

@dribeas: prawda jesteś, const zawsze dotyczy. @Matthew: char * i char [] są tylko takie same w pewnych okolicznościach, operator sizeof nie jest jednym z nich. –