静态vs重新解释POD类型的指针之间的转换

颈巾

我在尝试遍历运行时已知字节长度的字节数组时遇到了这个问题。https://godbolt.org/z/-vgEk_

#include <cstdint>

void f()
{
    uint8_t* array = new uint8_t[4*10];

    // cannot convert 'unsigned char*' to 'unsigned int*' in initialization
    uint32_t* fourByteIterator1 = array;

    // invalid static_cast from 'unsigned char*' to 'unsigned int*'
    uint32_t* fourByteIterator2 = static_cast<uint32_t*>(array);

    // no problems
    uint32_t* fourByteIterator3 = (uint32_t*)array;

    // no problems
    void* intermediate = static_cast<void*>(array);
    uint32_t* fourByteIterator4 = static_cast<uint32_t*>(p);

    // no problems
    uint32_t* fourByteIterator5 = reinterpret_cast<uint32_t*>(array);
}

为什么static_cast第二次转换失败?然后,如果直接转换为using 时,从转换void*为to 无效,为什么有效是否通过与直接重新解释转换相同的方式将指针类型静态转换为两次uint32_t*uint32_t*static_castvoid*

鲍洛夫:
uint32_t* fourByteIterator1 = (whatever_cast)array;

fourByteIterator1无论您如何设法使演员正常工作,访问都是未定义的行为。访问从new uint8_t[4*10];作为类型对象获得的内存uint32_t违反了严格的别名规则。

至于为什么某些强制转换方法起作用而其他无效的原因……这就是标准所说的。这些规则就像是在保护您避免犯错误。除了with之外,您无法在其他对象之间直接进行转换,这reinterprect_cast很好地表明您可能不应该这样做。

强制转换通过void*起作用,因为可以将任何指针类型都强制转换为对象,void *并且如果您强制转换为原始指针类型,则可以保证将原始指针取回。这就是为什么比void *其他指针类型更“允许” 与“来自”的转换。但这不是你在做什么。您没有回退到原始指针类型。

通过void *两次静态转换指针类型是否与直接重新解释转换相同?

是。

结论:不要那样做。这是未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

静态并重新解释转换-定义的行为?

重新解释强制转换为不同类型的C ++

重新解释无类型标识符的强制转换

为什么不为相同大小类型之间的类型转换重新解释强制强制copy_n?

为什么允许将自身重新解释积分,枚举和成员指针类型重新解释?

constexpr和带有重新解释强制转换的静态const void指针的初始化,哪个编译器正确?

结构对齐和类型重新解释

为什么我必须要重新解释指针指针?

重新解释 std 字符串的 std 向量的转换

使用constexpr解决重新解释转换限制

如何使用静态多态在int和指针类型之间转换?

重新解释终端输出

如何通过其他类型重新解释数据?(类型为punning混淆)

字符指针类型之间的转换

在函数指针类型之间转换

Go和Postgres将整数重新解释为nil类型

以与标准数组相同的方式用与数组相同类型的成员重新解释结构

如何重新解释强制转换数组,这样做安全吗?

常量和重新解释强制转换是否在编译时发生?

重新解释强制转换值因编译器而异

重新解释将数组从字符串转换为整数

重新解释为空是合法的*

如何在Swift中重新解释?

重新解释C中的演员

将整数静态转换为指针类型

0xff800001 和 0xffb00000 之间的长值重新解释为浮动错误

在没有其他成员的情况下重新解释转换为派生类好吗?

如何正确地将std :: vector <std :: vector <double>>强制转换为void *并重新解释回去?

通用嵌套记录的类型之间的静态转换