作为结构访问数组与未定义的行为

时间:2016-05-13 13:27:36

标签: c++ pointers casting undefined-behavior

假设我们的结构包含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

1 个答案:

答案 0 :(得分:4)

是的,确实是一种未定义的行为。它违反了所谓的严格别名规则 - 它禁止通过无关指针访问对象(我不会在这里详细介绍无关的细节,除非特别说明问)。

但是,结构的浮点数组是不相关的。

以下是标准(3.10 / 10)的摘录:

  

如果程序试图通过访问对象的存储值   行为是除以下类型之一以外的glvalue   未定义:

     

- 对象的动态类型,

     

- 对象的动态类型的cv限定版本,

     

- 类似的类型(如   4.4)中定义的对象的动态类型,

     

- 一种类型   对应于动态类型的有符号或无符号类型   对象,

     

- 对应的有符号或无符号类型的类型   对象的动态类型的cv限定版本,

     

- 包含上述类型之一的聚合或联合类型   其元素或非静态数据成员(包括,递归地,   子聚合或包含的元素或非静态数据成员   联合),

     

- 一种类型(可能是cv限定的)基类类型   对象的动态类型,

     

- char或unsigned char类型。