结构指针兼容性

Wan*_*eck 9 c struct casting ansi

假设我们有两个结构:

typedef struct Struct1
{
    short a_short;
    int id;
} Struct1;

typedef struct Struct2
{
    short a_short;
    int id;
    short another_short;
} Struct2;
Run Code Online (Sandbox Code Playgroud)

从哪里投Struct2 *来安全Struct1 *?ANSI规范对此有何规定?我知道有些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容.有没有办法确定这段代码是否有效,无论编译器标志如何?

谢谢!

unw*_*ind 5

据我所知,这是安全的.

但如果可能的话,做得更好:

typedef struct {
    Struct1 struct1;
    short another_short;
} Struct2;
Run Code Online (Sandbox Code Playgroud)

然后你甚至告诉编译器Struct2以一个实例开始Struct1,并且因为指向结构的指针总是指向它的第一个成员,所以你可以安全地将a Struct2 *视为一个Struct1 *.


oua*_*uah 4

结构指针类型在 C 中始终具有相同的表示形式。

(C99,6.2.5p27)“所有指向结构类型的指针应具有相同的表示和对齐要求。”

在 C 中,结构类型中的成员始终是按顺序排列的。

(C99,6.7.2.1p5)“结构是由一系列成员组成的类型,其存储按有序序列分配”

  • 这并不能回答问题;即使有这些限制,它仍然可能是别名违规。然而,在某些条件下,C 标准确实明确允许 OP 想要的东西。 (3认同)