【问题标题】:Segmentation fault after assigning an pointer to a specific memory address and changing its value分配指向特定内存地址的指针并更改其值后的分段错误
【发布时间】:2019-05-19 02:48:38
【问题描述】:

好的, 我有一个在 linux 上读取外部虚拟内存的工作程序。 这就是我想要做的: 程序 1 被执行并在内存中有特定的地址来与程序 2 通信。 我知道正在向程序 1 读写值的程序 2 正在工作 我被程序2的制作困住了,我有这个代码:

#include <iostream>
using namespace std;
int main()
{
  int* i;
  i = (int*)0x7ffABCDDCBA1;
  *i = 1;
  cout << *i << " " << i << endl;
}

注意:

这只是一个测试代码,看看它是否有效(它没有)

program1 将在程序 2 的 pid 处读取 0x7ffABCDDCBA1, 它编译得很好,但在执行时我得到“分段错误”

注意:

#include <iostream>
using namespace std;
int main()
{
  int* i;
  i = (int*)0x7ffABCDDCBA1;
  cout << i << endl;
}

效果很好

【问题讨论】:

  • 你应该知道*i和i的区别。您可能在第一个代码中取消引用无效的内存地址
  • 一个进程中的内存地址在另一个进程中没有意义。这就是虚拟寻址的用途。

标签: c++ linux pointers memory segmentation-fault


【解决方案1】:

您正在访问一些随机内存位置,该位置很可能不属于您的进程地址空间,因此会导致未定义的行为。

您应该在进程之间使用共享内存:How to use shared memory in Linux

其他技术很少,但这个最常用于此目的。

【讨论】:

  • 你说得对,但我想知道我是否可以这样做,这个项目只是为了好玩,所以如果有办法做到这一点,那就太好了
  • 是的,它可能工作,但正如我所说 - 它具有未定义的行为。这就是为什么它有时有效,有时无效的原因。
  • 没问题,我会推荐你​​一些linux地址空间相关的文章。读起来很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多