2009-09-08 16 views
39

El siguiente códigocadena literal Sizeof

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

salidas

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

en un sistema operativo de 32 bits, compilados con GCC.

  1. ¿Por qué sizeof calcular la longitud de (el espacio necesario para) la cadena literal?
  2. ¿La cadena literal tiene un tipo diferente (de char * o char []) cuando se administra a sizeof?

Respuesta

89
  1. sizeof("f") debe devolver 2, uno para la 'f' y uno para la terminación '\ 0'.
  2. sizeof(foo) retornos 4 en una máquina de 32 bits y 8 en una máquina de 64 bits porque foo es un puntero
  3. sizeof(bar) devuelve 2 porque bar es una matriz de dos caracteres, el 'B' y el terminador '\ 0 '.

La cadena literal tiene el tipo 'array de tamaño N de char' donde N incluye el terminal nulo.

Recuerde, las matrices no se deterioran a los punteros cuando se pasa a sizeof.

+9

1, pero el tipo es en realidad 'array de N caracteres const' (const no es opcional) –

+4

@dribeas: sí; Estaba ignorando los calificadores, pero estás pedantemente correcto. –

+11

@JonathanLeffler ... el mejor tipo de corrección, especialmente cuando se trata de programación –

11

sizeof devuelve el tamaño en bytes de su operando. Eso debería responder a la pregunta número 1.;) Además, un literal de cadena es del tipo "array to n const char" cuando se pasa al sizeof.

Sus casos de prueba, uno por uno:

  • "f" es una cadena literal que consiste en dos caracteres, el carácter f y la terminación de nulo.
  • foo es un puntero (edit: independientemente de la fase de clasificación), y parece ser punteros 4 bytes de longitud en el sistema ..
  • Para bar el caso es lo mismo que "f".

Espero que ayude.

+0

¿Por qué es un 'char []' lo mismo que un striong literal sin embargo? No soy un experto en C/C++, pero pensé que 'char []' y 'char *' eran intercambiables? –

+0

1 en la respuesta general (y para la velocidad :) Un par de precisiones: foo es un puntero (esencialmente calificador no se aplica) y en C++ el tipo es siempre "matriz de n const char" (constante-dad no es opcional) –

+0

@dribeas: como es, siempre se aplica. @Matthew: char * y char [] son ​​las mismas bajo ciertas circunstancias, el operador sizeof no es uno de ellos. –