【发布时间】:2024-01-09 19:52:01
【问题描述】:
假设我们有一个包含 4 个 float 值的结构和一个包含 4 个元素的 float 数组。
然后是否将数组作为Foo 实例访问并通过该实例更改数组元素是未定义的行为?
struct Foo
{
float a;
float b;
float c;
float d;
};
float values[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
int main()
{
auto& floats = *reinterpret_cast<Foo*>(values);
floats.a = 0.0f;
floats.b = 0.0f;
floats.c = 0.0f;
floats.d = 0.0f;
}
在线编译运行:http://cpp.sh/6y7m
【问题讨论】:
-
调用严格别名,严格别名,我们在第7行调用。
-
这怎么可能定义得很好?每个班级成员之间可能存在任意填充。
-
@LightnessRacesinOrbit 对。想要黑白的:)
-
事实上,@LightnessRacesinOrbit 是在说别的。比方说,你用字符数组替换你的浮点数组,并开始在某个偏移量处访问它的元素并将浮点值复制到其中。该程序将是格式良好的,并且不会有未定义的行为。但是由于填充,您不太可能在结构中找到包含您期望它们的值的浮点成员。
标签: c++ pointers casting undefined-behavior