我有以下的代码:
#include <stddef.h>
int main() {
struct X {
int a;
int b;
} x = {0, 0};
void *ptr = (char*)&x + offsetof(struct X, b);
*(int*)ptr = 42;
return 0;
}
最后一行代码执行了对x.b
的间接访问。
这段代码是否符合任何C标准?
我知道:
*(char*)ptr = 42;
虽然只定义了实现,但是是被定义的。ptr == (void*)&x.b
我猜想通过int*
访问ptr
指向的数据并不违反严格别名规则,但我不能完全确定标准保证了这一点。
x.b
是一个具有有效(和声明的)类型为int
的对象,其存储的值通过类型为int
的lvalue表达式访问,因此这是完全合法的。 - Ian Abbottoffsetof
宏的目的不就在于此吗? - Eugene Sh.