Странный адрес указателя для отдельного члена данных структуры

Сегодня я наблюдаю странное поведение, код выглядит следующим образом:

Код:

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

Вопрос:

1.) Единственный вопрос, который у меня есть, это почемуcout theAddressдля приведенного выше кода выйдет какое-то странное значение?

2.) Почему я все еще могу изменить значение участника c разыменовывая указатель, который имеет странный адрес?

Спасибо.

2 ответа

Решение

Попробуйте исправить код следующим образом:

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

Есть std::ostream& operator<< (std::ostream& out, const char* s ); это занимает char* так что вы должны бросить void* печатать адрес, а не строку, на которую он "указывает"

Я думаю, что "странные" вещи появляются, потому что cout считает, что это cstring, то есть массив символов с нулем в конце, поэтому он не печатает адрес, как вы ожидали. А так как ваша "строка" не заканчивается 0, все, что она может сделать, - это ходить по памяти, пока не встретит 0, Подводя итог, вы на самом деле не печатаете адрес.

Почему я все еще могу изменить значение члена c, разыменовав указатель со странным адресом

Адрес не странный, как объяснено выше. В вашем коде Cptr указывает на правильную ячейку памяти, и вы можете делать с ней практически все, что захотите.

Другие вопросы по тегам