以下是明确定义的:
char* charPtr = new char[42];
int* intPtr = (int*)charPtr;
charPtr++;
intPtr = (int*) charPtr;
The intPtr
未正确对齐(至少在两种情况之一)。仅仅把它放在那里就违法了吗? UB在任何阶段都使用它吗?你如何使用它,又如何不能使用它?
一般来说,如果对齐要求如下,则结果是未指定的(5.2.10p7)int
大于char
,他们通常会这样。结果将是该类型的有效值int *
所以它可以是例如打印为指针operator<<
或转换为intptr_t
.
因为结果有一个未指定的值,除非由实现指定,否则间接它并对结果执行左值到右值转换是未定义的行为int
左值(除了未评估的上下文)。转换回char *
不一定会往返。
不过,如果原来的char *
本身就是演员阵容的结果int *
,然后强制转换为int *
算作往返行程的后半程;在这种情况下,强制转换已定义。
特别是,在上述情况下,char *
是一个结果new[]
表达式,我们保证(5.3.4p10)char *
指针适当对齐int
, 只要sizeof(int) <= 42
。因为new[]
表达式从分配函数获取其存储,3.7.4.1p2 适用;这void *
指针可以转换
指向具有基本对齐要求的任何完整对象类型的指针,然后用于访问对象[...]这与 5.3.4p10 的注释一起强烈暗示,这同样适用于char *
返回的指针new[]
表达。在这种情况下int *
是一个指向未初始化的指针int
对象,因此在其间接寻址上执行左值到右值转换是未定义的 (3.8p6),但对其间接寻址的分配是完全定义的。这int
对象是在分配的存储空间中(3.7.4.1p2) 因此转换int *
回到char *
将产生每 1.8p6 的原始值。这不适用于递增的char *
指针为除非sizeof(int) == 1
它不是一个地址int
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)