有没有办法从另一个C程序访问一个C指针的数据
我有两个节目 程序A是这样的,有没有办法从另一个C程序访问一个C指针的数据,c,memory,memory-management,C,Memory,Memory Management,我有两个节目 程序A是这样的, int main(int argc, char** argv) { char* s = "hello"; printf(s); return (EXIT_SUCCESS); } s的基址是0x80484e0“hello”,现在我有了程序B,如下所示 int main(int argc, char** argv) { void* p = (void*)0x80484e0; char* c = (char*)p;
int main(int argc, char** argv) {
char* s = "hello";
printf(s);
return (EXIT_SUCCESS);
}
s的基址是0x80484e0“hello”,现在我有了程序B,如下所示
int main(int argc, char** argv) {
void* p = (void*)0x80484e0;
char* c = (char*)p;
while(*c)
{
printf("%c",*c);
c++;
}
return (EXIT_SUCCESS);
}
在程序B中,“p”与程序B中的“s”指向相同的基址,但内容不同
即使“p”和“s”具有相同的基址,它们的内容也不相同,这是因为它们在不同的地址空间中作为不同的程序运行吗
在程序B中,“p”与中的“s”指向相同的基址
程序B,但内容不同
这就是虚拟地址和独立地址空间的魔力。您需要查看平台的“共享内存”
程序使用的地址是虚拟的。它们与RAM中的物理地址不同。内核在MMU和一个页面表的帮助下做了一些好的(讨厌的)事情,并将其隐藏在进程中
因此,例如在32b系统上,进程认为它是内存的唯一用户—它可以使用从0
到0xffffffff
的地址,但有一定的限制
如果您碰巧在POSIX系统上,您可以查看mmap
和shm\u open
在程序B中,“p”与中的“s”指向相同的基址
程序B,但内容不同
这就是虚拟地址和独立地址空间的魔力。您需要查看平台的“共享内存”
程序使用的地址是虚拟的。它们与RAM中的物理地址不同。内核在MMU和一个页面表的帮助下做了一些好的(讨厌的)事情,并将其隐藏在进程中
因此,例如在32b系统上,进程认为它是内存的唯一用户—它可以使用从0
到0xffffffff
的地址,但有一定的限制
如果您碰巧在POSIX系统上,您可以查看
mmap
和shm_open
如果您使用的几乎是任何操作系统,那么就会有这样的概念。因此,一个进程中的某个内存地址在另一个进程中不一定相同。即使它很有可能映射到同一个物理地址,那么通过尝试读取它,您也有希望获得一个新的地址,因为您正在访问进程不“拥有”的内存。如果您使用的是几乎所有的操作系统,则会有这样的概念。因此,一个进程中的某个内存地址在另一个进程中不一定相同。即使它很有可能映射到同一个物理地址,那么通过尝试读取它,您可能会得到一个响应,因为您正在访问进程不“拥有”的内存。我相信这永远不会起作用
在程序A中,“hello”是可执行文件附带的字符串,在调用该程序时加载到内存中。我相信这永远不会起作用
在程序A中,“hello”是可执行文件附带的字符串,在调用该程序时加载到内存中。您所指的地址应特定于每个程序。您必须轮询操作系统以找到另一个程序的初始化位置。每个程序都存在于其自己的虚拟地址空间中。操作系统将虚拟地址映射到物理地址(或将其分页为物理地址)。一个进程中的虚拟地址在另一个进程中毫无意义。您所指的地址应特定于每个程序。您必须轮询操作系统以找到另一个程序的初始化位置。每个程序都存在于其自己的虚拟地址空间中。操作系统将虚拟地址映射到物理地址(或将其分页为物理地址)。一个进程中的虚拟地址在另一个进程中毫无意义。@AnanthaKrishnan:否,因为从
malloc
返回的地址是该进程特有的虚拟地址。只有操作系统知道虚拟地址真正指向哪里。@AnanthaKrishnan:不知道,因为从malloc
返回的地址是特定于进程的虚拟地址。只有操作系统才知道虚拟地址真正指向哪里。