我有一个继承自struct Base的struct X. 但是,在我目前的设置中,由于对齐,X的大小为24B:
typedef struct {
double_t a;
int8_t b;
} Base;
typedef struct {
Base base;
int8_t c;
} X;
Run Code Online (Sandbox Code Playgroud)
为了保存内存,我想展开Base结构,所以我创建了包含Base的字段的struct Y(以相同的顺序,总是在struct的开头),所以struct的大小是16B :
typedef struct {
double_t base_a;
int8_t base_b;
int8_t c;
} Y;
Run Code Online (Sandbox Code Playgroud)
然后我将在一个方法中使用struct Y的实例,该方法需要一个指向Base结构的指针:
void print_base(Base* b)
{
printf("%f %d\n", b->a, b->b);
}
// ...
Y data;
print_base((Base*)&data);
Run Code Online (Sandbox Code Playgroud)
上面的代码是否违反了严格的别名规则,并导致未定义的行为?