4

私はいくつかの適性の質問を経験しています。これはトリッキーに見えましたが、誰か説明できますか?

struct {
    int foo : 4;
} baz;

int *example()
{
    return &baz.foo;
}

これは無効なコードですが、理由がわかりませんでした。

4

4 に答える 4

7
int foo : 4;

fooビットフィールドとして宣言します。ビットフィールドのアドレスを取得してはなりません。

セクション6.5.3.2の開始:

単項演算子のオペランドは&、関数指定子、単項演算子[]または単項演算子の結果、またはビットフィールドではなくレジスタストレージクラス指定子で宣言されていないオブジェクト*を指定する左辺値のいずれかでなければなりません。

したがって、アドレス演算子をビットフィールドに適用することは制約違反です。(ビットフィールドはバイト境界で開始する必要がないため、あまり意味がありません。)

于 2013-03-19T12:17:03.273 に答える
4

宣言のコロン構文はビットフィールドとしてstruct宣言します。foo

ビットフィールドは、アーキテクチャのアドレス可能な最小のメモリ(通常、多くの最新のCPUアーキテクチャのバイト)よりも小さい可能性があるため、そのようなメンバーのアドレスを取得することは許可されていません。

したがって、このコードはそのルールに違反しているため、コンパイルに失敗します。

于 2013-03-19T12:18:32.933 に答える
2

fooフィールドは4ビット幅のビットフィールドであり、1バイトよりも小さいです。ポインタはバイト全体しかアドレス指定できないため、これは無効です。fooが8ビットまたは32ビット幅(最新のアーキテクチャではフル/アラインされたバイト)であったとしても、これは依然として無効です。

于 2013-03-19T12:18:13.797 に答える
1

私はあなたがあなたのファイルをコンパイルするならあなたは解決策を持っていると思います:

cannot take address of bit-field 

メモリアーキテクチャでは、ポインタを使用するたびに、ポインタが指すアドレスを取得するためです。ただし、bazはビットフィールドであるため、無効になります。

于 2013-03-19T12:21:28.817 に答える