C 中的指针别名通常是未定义的行为(因为严格别名),但 C11 标准似乎允许对指向结构的指针和指向结构的第一个成员的指针进行别名
C11 6.7.2.1 (15)...指向结构对象的指针...指向其初始成员...反之亦然...
那么下面的代码是否包含未定义的行为?
struct Foo {
int x;
int y;
};
// does foe return always 100?
int foe() {
struct Foo foo = { .x = 10, .y = 20 }, *pfoo = &foo;
int *px = (int*)pfoo; *px = 100;
return pfoo->x;
}
这段代码是正确的。标准 C 和 C++ 的所有版本都允许这样做,尽管措辞有所不同。
不存在严格的别名问题,因为您访问的是 type 的对象int
通过类型的左值int
。当执行访问的左值与存储在内存位置的对象具有不同类型时,可能会应用严格的别名规则。
您引用的文本涵盖了指针强制转换实际上指向int
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)