在C ++中读取内存时出现分段错误

时间:2015-06-02 17:36:08

标签: c++ c++11 g++ c++14

我只是想使用两个C ++代码将值存储在特定的内存地址

我用来将数据写入内存并获取其地址的代码:

#include <iostream>

using namespace std;

int main()
{
  int i = 10;
  cout<<&i<<endl;
  cin>>i; // This is just to make sure program doesn`t end

  return 0;
}

我使用cin>>i;只是为了确保它不会结束。 获取int i的地址后,请输入以下代码:

#include <iostream>

using namespace std;

int main()
{
  // This address changes everytime and I change it everytime
  // This is just one temporary address
  volatile int *x = (volatile int *)0x7ffef9246e74; // [1]
  int y = *x;
  cout<<y<<endl;

  return 0;
}

[1]:我从http://techcrunch.com/2015/06/02/new-mongodb-connector-creates-direct-connection-to-data-visualization-tools/复制了这一行。

程序#1在我运行程序#2时继续运行

在运行第二个代码时,我得到segmentation fault (core dumped)。有什么帮助吗?

1 个答案:

答案 0 :(得分:8)

您的现代操作系统,编译器等的工作模式是错误的。第一次运行程序时,会为进程分配一个内存空间。此内存空间中的所有内容(虚拟内存空间)都由处理器的MMU映射到物理内存。

当进程完成时,其内存空间不再存在。下次启动同一个程序时,它将在另一个独立的内存空间中运行。它可能映射到不同的物理内存地址,甚至虚拟地址也不相同,或者它们被清除以确保没有信息从以前的进程中泄漏。

这意味着当您从第一个程序输入第二个程序的地址时,它没有任何意义。更糟糕的是,第一次运行时的内存地址不是第二次运行时的虚拟内存空间的一部分,因此CPU的MMU会检测到对内存位置的非法访问,并且会出现seg-fault。 / p>