ホームページ > バックエンド開発 > C++ > 「cout」が「char」メンバー変数のアドレスを正しく表示しないのはなぜですか?

「cout」が「char」メンバー変数のアドレスを正しく表示しないのはなぜですか?

Barbara Streisand
リリース: 2025-01-03 14:36:39
オリジナル
380 人が閲覧しました

Why Doesn't `cout` Display the Address of a `char` Member Variable Correctly?

Char データのアドレスが表示されないのはなぜですか?

次のコード スニペットを考えてみましょう:

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 ;
}
ログイン後にコピー

期待どおり、出力は表示されるはずです。 int、char、および string メンバー変数のアドレス。ただし、char 変数 b のアドレスは空白のままです。

Reason

この奇妙な現象は、<< が原因で発生します。演算子は、&b をアドレスではなく C スタイルの文字列として解釈します。 Char ポインタは、<< によってヌル終了文字シーケンスとして解釈されます。

解決策

この問題を解決して char 変数のアドレスを表示するには、次の修正コードを使用できます。

cout << "address of char   :" << (void *) &b << endl;
ログイン後にコピー

ここでは、 &b を void * に明示的に変換する C スタイルのキャスト。これは、<< に指示します。演算子を使用して、文字シーケンスではなくアドレスとして処理します。より安全な代替方法は、static_cast を使用することです:

cout << "address of char   :" << static_cast<void *>(&b) << endl;
ログイン後にコピー

別の興味深い観察

int、char、および string メンバー変数が public として宣言されると、出力はわずかに変化します:

  ... int    :  something 
  ... char   :   
  ... string :  something_2
ログイン後にコピー

ここで、something_2 は常に something より 8 小さいです。

この違いこれは、コンパイラがパブリック メンバー変数をパディングして、メモリ アクセスに最適な位置に配置するために発生します。この場合、char 変数は 8 バイトにパディングされる可能性があり、その結果、int 変数と string 変数のアドレスに 8 バイトの差が生じます。

以上が「cout」が「char」メンバー変数のアドレスを正しく表示しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート