例如,这段代码是否有效,或者它是否通过违反别名规则来调用未定义的行为?
int x;
struct s { int i; } y;
x = 1;
y = *(struct s *)&x;
printf("%d\n", y.i);
我的兴趣是使用基于此的技术来开发一种可移植的方法来执行别名读取。
更新:这是预期的用例,有点不同,但当且仅当上述有效时,它才应该有效:
static inline uint32_t read32(const unsigned char *p)
{
struct a { char r[4]; };
union b { struct a r; uint32_t x; } tmp;
tmp.r = *(struct a *)p;
return tmp.x;
}
GCC 根据需要将其编译为单个 32 位加载,并且它似乎避免了如果p
实际指向的类型不是char
. 换句话说,它似乎充当了 GNU C__attribute__((__may_alias__))
属性的可移植替代品。但我不确定它是否真的很好定义......