私はいくつかの適性の質問を経験しています。これはトリッキーに見えましたが、誰か説明できますか?
struct {
int foo : 4;
} baz;
int *example()
{
return &baz.foo;
}
これは無効なコードですが、理由がわかりませんでした。
私はいくつかの適性の質問を経験しています。これはトリッキーに見えましたが、誰か説明できますか?
struct {
int foo : 4;
} baz;
int *example()
{
return &baz.foo;
}
これは無効なコードですが、理由がわかりませんでした。
int foo : 4;
foo
ビットフィールドとして宣言します。ビットフィールドのアドレスを取得してはなりません。
セクション6.5.3.2の開始:
単項演算子のオペランドは
&
、関数指定子、単項演算子[]
または単項演算子の結果、またはビットフィールドではなくレジスタストレージクラス指定子で宣言されていないオブジェクト*
を指定する左辺値のいずれかでなければなりません。
したがって、アドレス演算子をビットフィールドに適用することは制約違反です。(ビットフィールドはバイト境界で開始する必要がないため、あまり意味がありません。)
宣言のコロン構文はビットフィールドとしてstruct
宣言します。foo
ビットフィールドは、アーキテクチャのアドレス可能な最小のメモリ(通常、多くの最新のCPUアーキテクチャのバイト)よりも小さい可能性があるため、そのようなメンバーのアドレスを取得することは許可されていません。
したがって、このコードはそのルールに違反しているため、コンパイルに失敗します。
fooフィールドは4ビット幅のビットフィールドであり、1バイトよりも小さいです。ポインタはバイト全体しかアドレス指定できないため、これは無効です。fooが8ビットまたは32ビット幅(最新のアーキテクチャではフル/アラインされたバイト)であったとしても、これは依然として無効です。
私はあなたがあなたのファイルをコンパイルするならあなたは解決策を持っていると思います:
cannot take address of bit-field
メモリアーキテクチャでは、ポインタを使用するたびに、ポインタが指すアドレスを取得するためです。ただし、bazはビットフィールドであるため、無効になります。