【问题标题】:C++ Getting value of pointer at memory address - segmentation faultC ++获取内存地址指针的值 - 分段错误
【发布时间】:2018-07-22 22:00:32
【问题描述】:

我有以下几行代码: (其中 a 是 int64_t* 而 i 是一个简单的 int 计数器)

   uintptr_t p = *a + (i * 4);
   int64_t value = *reinterpret_cast<int64_t *>(p); //***

我已按照以下堆栈溢出帖子获取此语法: C++ - Get value of a particular memory address

问题是我在指示的行上不断出现分段错误。 我认为这可能与指针算术有关,但我不完全确定。有谁知道为什么我会在这里遇到段错误?

【问题讨论】:

  • 显然计算的地址是错误的。
  • a 究竟指向什么?
  • 当我说“你到底想做什么?”时,我想我和其他人的想法一样。
  • 也许你的意思是p = a + (i * 4)
  • i*4 似乎真的很可疑。你知道 int64_t 有 8 个字节长吗?也许你应该使用 sizeof(int64_t)?

标签: c++ pointers memory


【解决方案1】:

您可能不想在第一行代码中取消引用 a

另外请记住 §3.10/10 关于别名的说法:

如果程序尝试通过以下方式访问对象的存储值 行为是以下类型之一以外的泛左值 未定义:

对象的动态类型,

对象的动态类型的 cv 限定版本,

与对象的动态类型类似(如 4.4 中定义)的类型,

对象的动态类型对应的有符号或无符号类型,

一种有符号或无符号类型,对应于对象动态类型的 cv 限定版本,在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(包括递归,子聚合或包含联合的元素或非静态数据成员),

一种类型,它是对象的动态类型的(可能是 cv 限定的)基类类型,

char 或 unsigned char 类型。

std::byte 已使用 C++17 添加到该列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2020-08-15
    • 2015-08-09
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多