指向对象表示元素或指向提供的存储元素的指针



让我们假设我有以下代码:

int* p = new (new unsigned char[3*sizeof(int)]) int{};
unsigned char* b = reinterpret_cast<unsigned char*>(p);
auto b2 = b + 2*sizeof(int);//it is UB if compilers do not assume that
                            //b is pointer to an unsigned char[3*sizeof(int)]
int* p2 = new (b2) int{}; 

b不是指向3*sizeof(int) Unsigned Char数组的指针,它为*p提供了存储,则C 标准的部分[Expr.Add]表示b+2*sizeof(int)是未定义的行为(UB)。否则,如果编译器必须假设b也是指向无符号字符数组的指针,该数组提供了*p的存储空间,那么它不是UB。

因此,是否在标准中指定了编译器必须假设bunsigned char[3*sizeof(int)]的指针,该指针为*p

提供了存储

根据[expr.static.cast]:

类型"指向CV1 void"类型 对象类型和CV2与CV1相同或更大的CV资格。如果原来 指针值表示内存中一个字节的地址a,并且A不满足对齐要求 t,然后未指定结果指针值。否则,如果原始指针值指向 对象A,并且有一个t型的对象B(忽略CV-qualification),它是指指相关的(6.9.2) 在a中,结果是指向b的指针。否则,指针值不变。

根据[Expr.Reinterpret.cast]:

可以将对象指针明确转换为其他类型的对象指针。当prvalue v 对象指针类型转换为对象指针类型"指向cv t",结果是static_cast(static_cast(v))。

所以我想b指向三个无符号字符的数组的元素。

最新更新