2009-09-08 19 views
39

Il seguente codicestringa Sizeof letterale

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

uscite

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

su un sistema operativo a 32 bit, compilati con GCC.

  1. Perché lo sizeof calcola la lunghezza di (lo spazio necessario per) la stringa letterale?
  2. La stringa letterale ha un tipo diverso (da char * o char []) se assegnato a sizeof?

risposta

89
  1. sizeof("f") deve restituire 2, uno per la 'f' e uno per la terminazione '\ 0'.
  2. sizeof(foo) ritorni 4 su una macchina a 32 bit e 8 su una macchina a 64 bit poiché foo è un puntatore
  3. sizeof(bar) restituisce 2 perché bar è un array di due caratteri, il 'b' e la terminazione '\ 0 '.

La stringa letterale ha il tipo 'matrice di dimensione N di carattere' dove N include il terminale null.

Ricordare che gli array non decadono ai puntatori quando passati a sizeof.

+9

+1, ma il tipo è in realtà 'array di N const caratteri' (const non è opzionale) –

+4

@dribeas: sì; Ignoravo le qualificazioni, ma tu sei pedanticamente corretto. –

+11

@ JonathanLeffler ... il miglior tipo di corretto, specialmente quando si tratta di programmazione –

11

sizeof restituisce la dimensione in byte del suo operando. Questo dovrebbe rispondere alla domanda numero 1.;) Inoltre, una stringa letterale è di tipo "array in n const char" quando viene passata a sizeof.

vostri casi di test, uno per uno:

  • "f" è una stringa letterale composto da due caratteri, il carattere f e la terminazione NULL.
  • foo è un puntatore (edit: a prescindere dalla qualificazione), e puntatori sembrano essere 4 byte lunghi sul vostro sistema ..
  • Per bar il caso è lo stesso di "f".

Spero che questo aiuti.

+0

Perché un 'char []' è lo stesso di un letterale striong? Non sono un esperto di C/C++, ma ho pensato che 'char []' e 'char *' fossero intercambiabili? –

+0

+1 sulla risposta generale (e per la velocità :) Un paio di precisioni: foo È un puntatore (essenzialmente non si applica il qualificatore) e in C++ il tipo è sempre "matrice di n const char" (la costante non è facoltativa) –

+0

@dribeas: giusto che tu sia, const vale sempre. @Matthew: char * e char [] sono solo gli stessi in determinate circostanze, l'operatore sizeof non è uno di questi. –

Problemi correlati