我有两个程序,
程序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;
while(*c)
{
printf("%c",*c);
c++;
}
return (EXIT_SUCCESS);
}
在程序B中,'p'指向程序B中与's'相同的基址,但内容不相同。
即使'p'和's'具有相同的基址,但它们的内容不相同,是因为它们在不同的地址空间中作为不同的程序运行?
答案 0 :(得分:4)
在程序B中,'p'指向与's'相同的基址 程序B但内容不相同。
这是虚拟地址和独立地址空间的神奇之处。您需要查看适用于您平台的“共享内存”。
程序使用的地址是虚拟。它们与RAM中的物理地址不同。在MMU和页面表的帮助下,内核做了一些不错的(讨厌的)东西并将其隐藏起来。
因此,例如在32b系统上,进程认为它是内存的唯一用户 - 它可以使用0
到0xffffffff
的地址 - 具有某些限制。
如果您恰好位于POSIX系统上,可以查看mmap
和shm_open
。
答案 1 :(得分:2)
如果您使用的是几乎任何操作系统,那么就会有virtual memory的概念。因此,一个进程中的某个内存地址在另一个进程中不一定相同。即使它确实通过一些纯粹的机会映射到相同的物理地址,然后通过尝试阅读它,您希望获得segmentation fault,因为您正在访问该进程不“拥有”的内存。 / p>
答案 2 :(得分:0)
我相信这永远不会奏效。
在程序A中,“hello”是可执行文件附带的字符串,并在您调用该程序时加载到内存中。