0

構造体は厳密な c 89 で適切に定義されていますか? 私はこのコードを意味します

struct a {
    int a, b;
    void * c;
} k;
//init k...
struct b {
    int u, w;
    long *data;
} p = *(struct b*)&k;

標準をサポートするすべてのコンパイラで動作しますか? キャストを逆にすると (たとえば、構造体 b から構造体 a へのキャスト)、c は最初と同じになりますか? gcc (-ansi -pedantic を使用しても)、Microsoft コンパイラなどで動作すると確信していますが、標準の c 89 であることは保証されますか?

ありがとうございました!

4

1 に答える 1

4

これをしないでください。フィールドを手動でコピーします。

struct b p;

p.u = k.a;
p.w = k.b;
p.data = (long *) k.c;

あなたのコードはおそらく問題なく動作しlong *通常void *は同じように実装されますが、なぜリスクを冒すのでしょうか? 標準は次のようなものを言います:

void へのポインタは、文字型へのポインタと同じ表現およびアラインメント要件を持つものとします。39) 同様に、互換性のある型の修飾または非修飾バージョンへのポインタは、同じ表現およびアラインメント要件を持つものとします。構造体型へのすべてのポインターは、互いに同じ表現とアライメントの要件を持つ必要があります。共用体型へのすべてのポインターは、互いに同じ表現とアライメントの要件を持つ必要があります。他の型へのポインターは、同じ表現またはアライメント要件を持つ必要はありません。

「他の型」 ( などlong) へのポインターが へのポインターと区別される最後の文に注意してくださいvoid

上記は明示的で、安全で、より明確です。

于 2012-12-05T10:21:52.257 に答える