6

私が次のような構造体を持っていると仮定します:

struct Struct {
    char Char;
    int Int;
};

sizeof( int )が1より大きく、コンパイラーがメンバー変数にパディングを追加しますChar-コンパイラーが生成したコードでパディングバイトの値を変更できますか?

Charつまり、ポインター演算を使用して、メンバー変数を囲むパディングバイトにデータを書き込み、後でvariable.Char =割り当てを行うと、コンパイラーによって生成されたコードがパディングバイトの一部も上書きする可能性がありますか?

4

4 に答える 4

13

コンパイラが、char を保存するために word write を使用するのに十分なほどスマートであるとしたらどうでしょうか? 大切に保管しておいたデータが失われる可能性があります。;-)

于 2010-01-06T13:49:20.943 に答える
10

次の文は間違っています:いいえ、パディングバイトを上書きしません。しかし、それを使用することはおそらく良い習慣ではありません。必要に応じて、そこにメンバー変数を追加します。

私は自分が愚かであることを(正しく)示すコメントに基づいて調査しました:

C標準には、セクションJ.1の不特定の動作を伴う「付録J」があります。「構造体または共用体に値を格納するときのパディングバイトの値」と書かれています。これは、コンパイラーがデータを構造体に書き込みたい命令を生成できることを意味します。これにより、メンバーの後のパディングを上書きできる可能性があります。

于 2010-01-06T13:47:15.283 に答える
4

あなたは確かにそこに何かを書くことができます、そしてmemsetそのような構造のインスタンスを-ingすることはそれをします。ただし、安全ではなく、そうすることは決して良い考えではありません。ある日、別の開発者が#pragmaどこかに配置するか、構造体宣言にメンバーを追加すると、コードが多くの奇妙で派手な方法で爆発し、デバッグにかなりの時間がかかる可能性があります。

于 2010-01-06T13:47:56.907 に答える
1

これを行う唯一の理由は、プラグインが悪意を持ってホスト アプリケーションをだまして余分なデータを保存させるようなものです。

ただし、将来のある時点で破損し、関係者全員にとって深刻な頭痛の種になるため、そうしないでください。

于 2010-01-06T13:49:23.253 に答える