假设我有两个结构:object和widget:
struct object {
int field;
void *pointer;
};
Run Code Online (Sandbox Code Playgroud)
struct widget {
int field;
void *pointer;
};
Run Code Online (Sandbox Code Playgroud)
还有一个函数:
void consume(struct object *obj)
{
printf("(%i, %p)\n", obj->field, obj->pointer);
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我尝试这样做:
struct widget wgt = {3, NULL};
consume(&wgt);
Run Code Online (Sandbox Code Playgroud)
我会违反严格的别名规则,从而产生未定义的行为。
据我了解,未定义的行为是由于编译器可能以不同的方式对齐结构字段的事实造成的:也就是说,填充字段以与地址边界对齐(但永远不会更改字段顺序,因为保证遵守该顺序)标准)。
但是如果这两个结构被打包怎么办?它们具有相同的内存布局吗?或者,换句话说,上面的代码是否consume()仍然具有未定义的行为(尽管存在持久的编译器警告)?
注意:我用于struct __attribute__((__packed__)) object { ... };打包(GCC)。
char* const p="C language\n";
printf("%s", p);
*p = "Change";
printf("%s", p);
Run Code Online (Sandbox Code Playgroud)
预计打印如下内容:
C language
Change
Run Code Online (Sandbox Code Playgroud)