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

C で Char 変数のアドレスが正しく表示されないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-03 19:02:43835ブラウズ

Why Doesn't the Address of a Char Variable Display Correctly in C  ?

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

次のコードを検討してください:

class Address {
public:
    int i;
    char b;
    string c;
    
    void showMap();
};

void Address::showMap() {
    cout << "address of int    : " << &i << endl;
    cout << "address of char   : " << &b << endl;
    cout << "address of string : " << &c << endl;
}

このコードを実行するときを実行すると、char 変数 'b' のアドレスが出力に表示されないことに気づくかもしれません。代わりに、空白の領域が表示されます。なぜこのようなことが起こるのでしょうか?

その理由は、アドレス演算子 (&) がさまざまなデータ型でどのように機能するかにあります。 char 変数 &b に適用すると、char ポインター、つまり char * が取得されます。

デフォルトでは、出力演算子 <<は、この char* を C スタイルの文字列として解釈し、文字シーケンスを出力しようとします。ただし、この場合は、char 変数の値ではなくアドレスのみを表示する必要があります。

この問題を解決するには、次のアプローチを使用できます。

cout << "address of char   : " << (void *) &b << endl;

こちら、出力演算子で使用する前に、b のアドレスを void * にキャストします。これにより、演算子はそれを文字シーケンスではなくメモリ位置へのポインタとして扱うようになります。

アドレス間の違いはなぜ 8 ですか?

メンバー変数 'int'、'char'、および 'string' public を使用すると、別の興味深い動作が観察される場合があります。 「int」と「string」のアドレスの差は一貫して 8 です。これは次の理由によるものです。

  • ほとんどのアーキテクチャでの int のデフォルトのアライメントは 4 バイトです。
  • デフォルトchar のアライメントは 1 バイトです。
  • 文字列のデフォルトのアライメントは 4 です。 bytes.

コンパイラは、クラス メンバーにメモリを割り当てる際、メンバーをそれぞれの境界に揃える方法でメモリを割り当てます。この場合、char 変数 'b' は 1 バイトを占有し、3 バイトの未使用スペースが残ります。このスペースの後には、最も近い 4 バイト境界に位置合わせされる文字列変数 'c​​' が続きます。

その結果、'&c' と '&b' のアドレスの差は 1 になります ( 'b' の場合) 3 (未使用スペースの場合) 4 ('c' の 4 バイト アライメントの場合) = 8.

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

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