![](/img/trans.png)
[英]Segmentation fault after assigning an pointer to a specific memory address and changing its value
[英]Assigning A Specific Memory Address from another program, and changing it's value
最近我離開學校幾天,想在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”功能。
我認為大多數操作系統都是為了讓你不可能(或者很難)做你想要做的事情 - 讓一個正在運行的程序(或進程)干擾另一個正在運行的程序(或進程)的地址空間的內容)。 既然你沒有告訴我們你的平台,就很難對此進行分類,但我懷疑o / s是在拯救你自己。 這種嚴格的過程分離是單用戶機器上的安全功能,是多用戶機器上的安全和安全功能。
當然,有許多用於運行並發進程的技術,這些進程可以共享內存或通過消息傳遞交換信息。 離開學校再多學時間學習一下!
看看內存映射文件或共享內存。
http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.