¿Por qué no se muestra la dirección de los datos de caracteres?
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 - something
es siempre igual a 8. ¿Por qué? (no 9)
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 << endl
en 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;
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
int
y thestring
es?8
En su plataforma sizeof(int)
está 4
y sizeof(char)
es 1
así que realmente debería preguntarse por qué 8
no 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)