C++ 如何使用指针在随机地址上操作?

C++ 如何使用指针在随机地址上操作?,c++,pointers,C++,Pointers,我同时运行两个独立的程序 *在第一个示例中,我动态分配一个整数并检索其地址 *在第二个程序中,当第一个程序仍在运行时,我使用第一个程序中生成的地址访问第二个程序中第一个程序中分配的指针处的值 但第二个程序总是崩溃 我的问题是-我可以使用指针从另一个程序访问一个程序的变量吗? 他们应该可以访问他们的地址。他们不应该吗 以下是第一个程序的代码:- //Program 1 #include<iostream> #include<conio.h> using namespace

我同时运行两个独立的程序

*在第一个示例中,我动态分配一个整数并检索其地址

*在第二个程序中,当第一个程序仍在运行时,我使用第一个程序中生成的地址访问第二个程序中第一个程序中分配的指针处的值

但第二个程序总是崩溃

我的问题是-我可以使用指针从另一个程序访问一个程序的变量吗? 他们应该可以访问他们的地址。他们不应该吗

以下是第一个程序的代码:-

//Program 1
#include<iostream>
#include<conio.h>

using namespace std;

int main()
{
  int *p;
  p= new int; //allocating an integer
  *p=15;      //setting up a value.
  getch();
  int x=(int)p;  //retrieving the address and converting it to decimal system.
  cout<<*p<<endl<<p<<endl<<x; //printing assigned value and address to use in second program
  getch();
  delete p;
 }
现在,虽然它仍然运行的指针还没有被删除,但是通过getch函数我启动了第二个程序,其代码如下

 //Program 2
 #include<iostream>
 #include<conio.h>

 using namespace std;

 int main()
 {
  int *p;
  int x;
  cout<<"Enter an address:-";
  cin>>x;
  cout<<endl;
  p=(int *)x;
  cout<<*p;
  getch();
 }

它询问地址,我输入第一个程序给出的地址16520104,我尝试在该地址显示赋值,但程序总是崩溃??为什么会这样呢?

两者都将作为一个单独的进程运行,并且都有自己的地址空间


当你试图访问你的地址空间时,这将是一个分段错误。

对于大多数平台,彼此的内存不同

此外,即使它们在同一进程中,或者您的平台允许进程读取彼此的内存,您所做的是因为:

无法保证指针将适合int。保证保存数值指针值的类型为。当然,您可以使用宽度更大的其他类型

如果您使用的是这些流行平台中的任何一个,则默认情况下进程是隔离的。引自:

支持进程隔离的显著操作系统:

Unix、Linux、OSX 虚拟机 来自Windows NT 3.1的Microsoft Windows 你最可能寻找的是某种形式的

我的问题是-我可以使用指针从另一个程序访问一个程序的变量吗

是的,如果您使用的操作系统不使用虚拟内存

他们应该可以访问他们的地址。他们不应该吗


不适用于具有虚拟内存的现代操作系统。每个应用程序都有自己的虚拟地址空间,程序A中的地址0x1234与程序B中的地址0x1234不同。您需要使用IPC或任何其他共享存储机制,以便在运行的程序之间进行通信。

这些地址是虚拟地址,仅对特定程序有效。操作系统将虚拟地址映射到物理地址


请参见

每个程序在虚拟地址空间中运行,您的第一个程序在执行main方法后终止。那么程序1中的变量地址就没有用处了。由于您试图访问另一个程序所指向的位置,因此出现运行时错误或分段错误1。如果你是
尝试在两个程序或两个进程之间进行通信使用进程间通信机制,如套接字、消息队列等。有关进程间通信的更多详细信息

在大多数现代操作系统中,每个进程在其自己的虚拟内存地址空间中运行,一个进程无法直接访问另一个进程的内存。不过,您可以使用适当的共享内存API进行进程间通信。在大多数现代系统中,每个进程都有自己的虚拟内存地址空间。这要看情况而定。对你来说有趣的研究将是共享内存、进程间通信、MMAP目标平台是什么?它使用虚拟寻址吗?我的操作系统是Windows 10 64位@Sergeykanavdirect内存,使用操作系统可能不足以让OP的程序工作。操作系统可能会使用另一种机制来保护进程的内存,以防止其他进程访问它。否则,您将收到运行时错误,因为该地址未在第二个程序中分配。其他程序地址空间不会映射到一个进程虚拟地址空间中的任何位置。进程A中的地址0x12345678在进程B中可能是一个完全不同的东西,也可能是零。在这种情况下,操作系统投诉您可以获得一个有效的地址,但内容完全不同。您没有尝试访问属于其他进程的地址。您试图访问一个本地地址,但之前不知道它的用途。
 //Program 2
 #include<iostream>
 #include<conio.h>

 using namespace std;

 int main()
 {
  int *p;
  int x;
  cout<<"Enter an address:-";
  cin>>x;
  cout<<endl;
  p=(int *)x;
  cout<<*p;
  getch();
 }