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

时间:2016-08-29 09:25:10

标签: c++ pointers

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

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

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

但是第二个程序总是崩溃。

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

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

function shuffleRandomFunfact(event) {
  // Generate a random number.
  var randomNumber = Math.floor(Math.random() * 4);
  // Loop through the nodelist.
  for (var i = 0; i < funfacts.length; i++) {
    // If the index of the current funfact is the same
    // as the random number.
    if (i === randomNumber)
      funfacts[i].style.display = 'inline';
    // Otherwise ...
    funfacts[i].style.display = 'none';
  }
}

输出就是这个......

//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函数暂停)我启动了第二个程序,其代码是这个..

 15
 0xfc13a8
 16520104

它要求输入地址,然后输入第一个程序给出的地址 16520104 ,我尝试在该地址显示指定值,但程序总是崩溃?为什么呢?

5 个答案:

答案 0 :(得分:2)

对于大多数平台而言,Processes are isolated的内存彼此相同(不同address space)。

此外,即使他们处于相同的过程中(或者您的平台允许进程读取彼此的内存),您正在做的是Undefined behavior,因为:

无法保证指针适合int。保证保存数字指针值的类型是std::uintptr_t。 (当然,你可以使用宽度更大的其他类型)。

如果您使用任何这些流行的平台,则默认情况下会隔离进程。引用Wikipedia

  

支持进程隔离的值得注意的操作系统:

     
      
  • Unix,Linux,OS X
  •   
  • VMS
  •   
  • Windows NT 3.1中的Microsoft Windows
  •   

您最有可能寻找的是某种形式的Interprocess Communication

答案 1 :(得分:1)

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

请参阅virtual address space.

答案 2 :(得分:1)

每个程序在执行main方法后第一个程序终止的所有虚拟地址空间中运行。然后在程序1中没有使用变量的地址。您将获得运行时错误或分段错误,因为您尝试访问另一个程序指向的位置1。如果你是 尝试在两个程序或两个进程之间进行通信,使用进程间通信机制,如Socket,Message Queue等,以获取有关进程间通信的更多详细信息https://en.wikipedia.org/wiki/Inter-process_communication

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

  

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

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

  

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

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