【问题标题】:Is it safe to cast pointer to integer, increment that integer, and cast back?将指针转换为整数,增加该整数并转换回来是否安全?
【发布时间】:2015-05-21 09:42:13
【问题描述】:

假设我有一个有效的指针p0

T a[10];
T* p0 = &a[0];

我知道我可以像这样安全地往返投射:

reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0;

但是执行以下操作是否安全?

T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T));

即我可以确定没有UB和p1 == &amp;a[1]吗?

【问题讨论】:

  • “我可以确定没有无符号字节”是什么意思? 在哪里
  • @theV0ID UB 是 C++ 世界中未定义行为的流行首字母缩写词。
  • 我很确定这在字寻址系统上会失败,其中将地址增加n 使其指向n*wordsize 字节。
  • @theV0ID:未定义的行为,不是无符号字节。

标签: c++ undefined-behavior reinterpret-cast pointer-conversion


【解决方案1】:

这是实现定义的行为。您的编译器应该记录指针算术是否等效于指针转换后的数值的整数算术。在具有“扁平”字节寻址内存空间的现代计算机上应该是这种情况。但不能保证在所有平台上都可移植。

使用char* 而不是uintptr_t 可以移植,只要您留在数组中并确保指针在转换回之前正确对齐T

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 2010-12-22
    • 2011-04-03
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多