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规范对此有何规定?我知道有些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容.有没有办法确定这段代码是否有效,无论编译器标志如何?
谢谢!
据我所知,这是安全的.
但如果可能的话,做得更好:
typedef struct {
Struct1 struct1;
short another_short;
} Struct2;
Run Code Online (Sandbox Code Playgroud)
然后你甚至告诉编译器Struct2以一个实例开始Struct1,并且因为指向结构的指针总是指向它的第一个成员,所以你可以安全地将a Struct2 *视为一个Struct1 *.
结构指针类型在 C 中始终具有相同的表示形式。
(C99,6.2.5p27)“所有指向结构类型的指针应具有相同的表示和对齐要求。”
在 C 中,结构类型中的成员始终是按顺序排列的。
(C99,6.7.2.1p5)“结构是由一系列成员组成的类型,其存储按有序序列分配”