サンプルコード:構造体のパディングバイトはメンバの割り当てによって保持されますか?
#include <assert.h>
struct S
{
unsigned char ch;
int i;
};
int main()
{
struct S s;
memset(&s, 0, sizeof s);
s.ch = 257;
assert(0 == ((unsigned char *)&s)[1]);
}
アサーションが失敗することはできますか?
質問の動機はリトルエンディアンシステム上のコンパイラがs.ch = 257;
を実装するために4バイトのストアを使用することを決定することができるかどうかです。私は私の例で行ったように明らかに誰もがこれまでのコードを記述しないだろうが、ch
はその後、構造体の等価性をチェックするためにmemcmp
を使用するために行くのプログラムでは、さまざまな方法で割り当てられている場合と同様のものが現実的に発生する可能性があります。
例えば、コードがs.ch = 257
の代わりに--s.ch
の場合、コンパイラはワードサイズ減少命令を発行できますか?
私は初期化されていないパディングに適用されるようDR 451周りの議論は、関連性があるとは思いません。 memset
はすべてのパディングを0バイトに初期化します。
あなたの見積もりに「メンバーオブジェクトに含める」が見落とされました。私の質問に答えるようです。しかし、なぜ構造体のパディング(初期化されていない)にアクセスするのが未定義の動作になるのかわかりません。 –
これは未定義の動作である「アクセスパディング」です。その初期化ステータスはアクセスできないため、無関係です。しかし、標準の関連部分を見つけるのに私はしばらく時間がかかるかもしれません... –
メモをつくる - これは私の答えの最終的な追加の一部かもしれません:§7.14.4.1** 'memcmp'関数** memcmp関数は、s1が指すオブジェクトの最初のn個の文字と、 とを比較します(s2.310で指し示されるオブジェクトの最初のn文字)。 - 310)構造内の整列のためにパディングとして使用される「穴」の内容オブジェクトは 不確定です。割り当てられた領域および共用体より短い文字列は、 比較でも問題を引き起こす可能性があります。 –