¿Por qué no se muestra la dirección de los datos de caracteres?

Resuelto asked hace 13 años • 8 respuestas
class Address {
      int i ;
      char b;
      string c;
      public:
           void showMap ( void ) ;
};

void Address :: showMap ( void ) {
            cout << "address of int    :" << &i << endl ;
            cout << "address of char   :" << &b << endl ;
            cout << "address of string :" << &c << endl ;
}

La salida es:

         address of int    :  something
         address of char   :     // nothing, blank area, that is nothing displayed
         address of string :  something 

¿Por qué?

Otra cosa interesante: si int, char, string está en público, entonces la salida es

  ... int    :  something 
  ... char   :   
  ... string :  something_2

something_2 - somethinges siempre igual a 8. ¿Por qué? (no 9)

 avatar Feb 01 '11 16:02
Aceptado

Cuando tomas la dirección de b, obtienes char *. operator<<lo interpreta como una cadena C e intenta imprimir una secuencia de caracteres en lugar de su dirección.

inténtalo cout << "address of char :" << (void *) &b << endlen su lugar.

[EDITAR] Como comentó Tomek, una conversión más adecuada para usar en este caso es static_cast, que es una alternativa más segura. Aquí hay una versión que lo usa en lugar del elenco estilo C:

cout << "address of char   :" << static_cast<void *>(&b) << endl;
hrnt avatar Feb 01 '2011 09:02 hrnt

Hay 2 preguntas:

  • Por qué no imprime la dirección del char:

Los punteros de impresión imprimirán la dirección de int*y string*pero no imprimirán el contenido de char*ya que hay una sobrecarga especial en operator<<. Si desea la dirección, utilice:static_cast<const void *>(&c);

  • ¿Por qué la diferencia de dirección entre the inty the stringes?8

En su plataforma sizeof(int)está 4y sizeof(char)es 1así que realmente debería preguntarse por qué 8no 5. La razón es que la cadena está alineada en un límite de 4 bytes. Las máquinas trabajan con palabras en lugar de bytes, y funcionan más rápido si las palabras no se "dividen", por lo tanto, en unos pocos bytes aquí y unos pocos bytes allá. Esto se llama alineación.

Probablemente su sistema se alinee con límites de 4 bytes. Si tuvieras un sistema de 64 bits con enteros de 64 bits, la diferencia sería 16.

(Nota: el sistema de 64 bits generalmente se refiere al tamaño de un puntero, no a un int. Por lo tanto, un sistema de 64 bits con un int de 4 bytes aún tendría una diferencia de 8, ya que 4+1 = 5, pero se redondea a 8. .Si sizeof(int) es 8 entonces 8+1 = 9 pero esto se redondea a 16)

CashCow avatar Feb 07 '2011 17:02 CashCow