Dirección de puntero extraño para miembro de datos de estructura individual

Observo un comportamiento extraño hoy, el código es el siguiente:

El código :

#include <iostream>

struct text
{
    char c;
};

int main(void)
{
    text experim = {'b'};
    char * Cptr = &(experim.c);

    std::cout << "The Value \t: " << *Cptr << std::endl ;
    std::cout << "The Address \t: " << Cptr << std::endl  ; //Print weird stuff

    std::cout << "\n\n";

    *Cptr = 'z';   //Attempt to change the value

    std::cout << "The New Value \t: " << *Cptr <<std::endl ;
    std::cout << "The Address \t: " << Cptr << std::endl ; //Weird address again

    return 0;
}

La pregunta :

1.) La única pregunta que tengo es por qué cout theAddress para el código anterior saldría algún valor extraño?

2.) ¿Por qué todavía puedo cambiar el valor del miembro? c eliminando la referencia del puntero que tiene una dirección extraña?

Gracias por su atención.

preguntado el 28 de julio de 12 a las 09:07

2 Respuestas

Considere arreglar el código de esta manera:

std::cout << "The Address \t: " << (void *)Cptr << std::endl ;

Hay una std::ostream& operator<< (std::ostream& out, const char* s ); eso toma un char* así que tienes que lanzar a void* para imprimir una dirección, no un cadena "apunta" a

Respondido 28 Jul 12, 10:07

Creo que las cosas "raras" aparecen porque cout piensa que es una cstring, es decir, una matriz de caracteres terminada en 0, por lo que no imprime la dirección como esperaba. Y dado que su "cadena" no termina en 0, todo lo que puede hacer es recorrer la memoria hasta que encuentre un 0. En resumen, en realidad no estás imprimiendo la dirección.

¿Por qué todavía puedo cambiar el valor del miembro c eliminando la referencia del puntero que tiene una dirección extraña?

La dirección no es extraña, como se explicó anteriormente. en tu codigo Cptr apunta a una ubicación de memoria válida y puedes hacer prácticamente cualquier cosa que quieras con ella.

Respondido 28 Jul 12, 09:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.