加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 从另一个程序分配特定的内存地址,并更改其值

发布时间:2020-12-16 10:27:08 所属栏目:百科 来源:网络整理
导读:最近我离开学校几天,想在C处做一个小程序实验来处理内存地址. 我想看到的是,如果当前正在运行的程序(让它称之为程序A)创建了一个指向堆中int对象的指针,则可以被另一个程序看到并进行修改(程序B). 所以对于程序A,这是我的基本代码: // Program A#include io
最近我离开学校几天,想在C处做一个小程序实验来处理内存地址.

我想看到的是,如果当前正在运行的程序(让它称之为程序A)创建了一个指向堆中int对象的指针,则可以被另一个程序看到并进行修改(程序B).

所以对于程序A,这是我的基本代码:

// Program A
#include <iostream>

using namespace std;

int main()
{
    // Pointer to an int object in the heap
    int *pint = new int(15);

    // Display the address of the memory in heap
    cout << pint << endl;

    // Display the value stored in that address
    cout << *pint << endl;

    return 0;
}

计划A的产出:

0x641030
15

对于程序B,我查看了如何通过此链接分配特定的内存地址:
http://www.devx.com/tips/Tip/14104

计划B的代码是:

// Program B
#include <iostream>

using namespace std;

int main()
{
    // assign address 0x641030 to p
    int *p = reinterpret_cast< int* > (0x641030);

    cout << p << endl;
    cout << *p << endl;

    return 0;
}

方案B的产出:

0x641030
... "Crash"

我不太明白.我期待从* p显示15,但它做了我没想到的事情.

我也尝试将* p分配给像* p = 2000这样的数字,但是当我尝试它时它也崩溃了.

此外,当我显示指针的地址和程序A(cout<<& pint;)和程序B(cout<& p;)时,它们都显示相同的存储器地址. 有谁知道究竟发生了什么?我很感兴趣但对于正在发生的事情感到困惑.另外,我有可能做我在C/C++中尝试的事情吗? **编辑**
很抱歉不提我的平台,但我目前正在使用Window 7 Professional

解决方法

简短的回答是,不同的进程使用完全不同的地址空间.如果不做更多的工作,进程B就无法从进程A读取或写入内存.

可以以特定于平台的方式执行此操作. Win32提供了诸如WriteProcessMemory之类的功能,您可以直接将值戳入另一个进程的内存空间.大多数操作系统提供共享内存功能,使用Win32可以使用内存映射文件,而Unix风格通常具有某种等效的“mmap”或“shmem”功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读