Tamaño de cadena literal

El siguiente código

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

salidas

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

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

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

  1. sizeof("f") debe devolver 2, uno para la ‘f’ y otro para la terminación ‘\ 0’.
  2. sizeof(foo) devuelve 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, la ‘b’ y la terminación ‘\ 0’.

El literal de cadena tiene el tipo ‘matriz de tamaño N de char’ donde N incluye el terminal nulo.

Recuerde, las matrices no se degradan a punteros cuando pasan a sizeof .

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 a sizeof .

Sus casos de prueba, uno por uno:

  • "f" es un literal de cadena que consta de dos caracteres, el carácter f y el NUL de terminación.
  • foo es un puntero (editar: independientemente de los calificadores), y los punteros parecen tener una longitud de 4 bytes en su sistema.
  • Para la bar el caso es lo mismo que "f" .

Espero que ayude.