short*到int*之间的转换

use*_*635 1 c++ undefined-behavior

假设short是2个字节,并且int在32位OS上是4个字节.以下是未定义的行为吗?

short s = 42;
int *p = (int*)(&s);
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 7

不,您发布的代码没有显示未定义的行为,但尝试阅读*p会.另外,根据所要求的对齐intshort,铸造的结果可能是不确定的,并且不可逆转(见5.2.10 [expr.reinterpret.cast]/7).

见ISO/IEC 14882:2011 3.10 [basic.lval]/10:

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

  • 对象的动态类型,
  • 一个cv限定版本的动态类型的对象,
  • 与对象的动态类型类似的类型(如4.4中所定义),
  • 与对象的动态类型对应的有符号或无符号类型的类型,
  • 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
  • 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),
  • 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
  • char或unsigned char类型.

您尝试访问的对象是a short并且*p是类型的glvalue,int它不符合上述任何描述.