gpt4 book ai didi

c++ - 在原始类型指针之间进行转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:36 25 4
gpt4 key购买 nike

以下是否明确定义:

char* charPtr = new char[42];
int* intPtr = (int*)charPtr;

charPtr++;
intPtr = (int*) charPtr;

intPtr 未正确对齐(至少在这两种情况中的一种情况下)。放在那里是违法的吗?是UB在任何阶段使用它吗?您如何使用它,又如何不能使用它?

最佳答案

一般来说,如果 int 的对齐要求大于 char 的对齐要求,则结果是未指定的 (5.2.10p7),它们通常会是这样。结果将是 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 对象的地址。

关于c++ - 在原始类型指针之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com