1

今日、いくつかの奇妙な動作を観察しました。コードは次のとおりです。

コード :

#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上記のコードで奇妙な値が出てくるのでしょうか?

c2.)奇妙なアドレスを持つポインタを逆参照することで、メンバーの値を変更できるのはなぜですか?

ありがとうございました。

4

2 に答える 2

5

次のようにコードを修正することを検討してください。

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

それが「指す」文字列ではなく、アドレスを印刷するためにキャストする必要があるので、std::ostream& operator<< (std::ostream& out, const char* s );がかかることがありますchar*void*

于 2012-07-28T08:26:15.410 に答える
5

cstring、つまり 0 で終わる文字配列であると考えているため、「奇妙な」ものが表示されるcoutと思います。そのため、期待どおりにアドレスが出力されません。また、「文字列」は 0 で終了していないため、0. 要約すると、実際には住所を印刷していません

奇妙なアドレスを持つポインターを逆参照することで、メンバー c の値を変更できる理由

上で説明したように、アドレスは変ではありません。あなたのコードCptrでは有効なメモリ位置を指しており、それを使ってほとんど何でもできます。

于 2012-07-28T08:26:07.793 に答える