4

このタイプのオブジェクトをスタックに作成した場合、このオブジェクトのメモリが適切に配置されるという保証はありますか?

union my_union
{
  int value;
  char bytes[4];
};

スタックにcharbytes[4]を作成し、それを整数にキャストしようとすると、アライメントの問題が発生する可能性があります。ヒープ内に作成することでその問題を回避できますが、ユニオンオブジェクトにそのような保証はありますか?論理的にはあるはずですが、確認したいと思います。

ありがとう。

4

2 に答える 2

3

まあ、それはあなたが何を意味するかに依存します。

あなたが意味する場合:

intと組合員の両方char[4]が適切に調整され、互いに独立して使用できるようになりますか?

それならそうです。あなたが意味する場合:

intchar[4]メンバーは、同じ量のスペースを占めるように調整されることが保証されます。これにより、を介しての個々のバイトにアクセスできるようになりintますchar[4]か?

その後、いいえ。これは、sizeof(int)4であることが保証されていないためです。sintが2バイトの場合、どの2つのchar要素がintあなたのに対応するかを誰が知ってunionいますか(標準では指定されていません)。

ユニオンを使用しての個々のバイトにアクセスする場合は、次intを使用します。

union {
  int i;
  char c[sizeof(int)];
};

各メンバーは同じサイズであるため、同じスペースを占めることが保証されています。これはあなたが知りたいと思うことであり、私はそれに答えたと思います。

于 2010-12-21T05:14:53.080 に答える
2

ええ、そうでなければ組合は全く役に立たないでしょう。

于 2010-12-21T05:06:16.183 に答える