ホームページ >バックエンド開発 >C++ >クラス内の Char メンバーのアドレスを印刷すると空白に見えることがあるのはなぜですか?また、空白ではないのに 8 バイトのオフセットがあるのはなぜですか?

クラス内の Char メンバーのアドレスを印刷すると空白に見えることがあるのはなぜですか?また、空白ではないのに 8 バイトのオフセットがあるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-20 07:50:10987ブラウズ

Why Does Printing the Address of a Char Member in a Class Sometimes Appear Blank, and Why Is There an 8-Byte Offset When It's Not?

Char データ表示異常のアドレス

int、char、string のさまざまな型のデータ メンバーを持つクラスを含むプログラムでは、これらのデータ メンバーのアドレスを出力すると、予期しないことが判明します。 int と string のアドレスが表示される一方で、char データ メンバーのアドレスは空白で表示されます。

この問題を解決するには、char データ型の基になる表現を検討してください。 & 演算子を使用して char 変数のアドレスを取得すると、char へのポインタが取得されます。ただし、ストリーム挿入演算子 (<<) は、このポインタを C スタイルの NULL 終了文字列として解釈します。その結果、ポインタに関連付けられた文字列を出力しようとしますが、この場合は存在しません。

この動作を修正するには、static_cast を使用して char 変数のアドレスを void ポインタに明示的にキャストします。そうすることで、値を文字列ではなくアドレスとして解釈するようにストリーム挿入演算子に指示します。 "文字のアドレス:" << static_cast(&b) << endl;


さらに、クラス データ メンバーが public と宣言されると、興味深いことが起こります。 char 変数のアドレスが表示されますが、int 変数のアドレスと比較すると 8 バイトのオフセットがあります。

<p> ... int : something </p> .. .char : something_2<p> ... 文字列 : something_3<br>


興味深いことに、something_2 - something は常に 8 です。これは、効率的なメモリ レイアウトのためにクラス メンバーに適用されるパディングに由来します。 char 変数は 1 バイトのみを占有しますが、アライメント要件により 4 バイトが割り当てられます。この 3 バイトのパディングにより、観測されたオフセットが作成されます。

以上がクラス内の Char メンバーのアドレスを印刷すると空白に見えることがあるのはなぜですか?また、空白ではないのに 8 バイトのオフセットがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。