有没有办法从另一个C程序访问一个C指针的数据

时间:2012-03-16 10:49:02

标签: 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;

    while(*c)
    {
        printf("%c",*c);
        c++;
    }

    return (EXIT_SUCCESS);
}

在程序B中,'p'指向程序B中与's'相同的基址,但内容不相同。

即使'p'和's'具有相同的基址,但它们的内容不相同,是因为它们在不同的地址空间中作为不同的程序运行?

3 个答案:

答案 0 :(得分:4)

  

在程序B中,'p'指向与's'相同的基址   程序B但内容不相同。

这是虚拟地址和独立地址空间的神奇之处。您需要查看适用于您平台的“共享内存”。

程序使用的地址是虚拟。它们与RAM中的物理地址不同。在MMU和页面表的帮助下,内核做了一些不错的(讨厌的)东西并将其隐藏起来。

因此,例如在32b系统上,进程认为它是内存的唯一用户 - 它可以使用00xffffffff的地址 - 具有某些限制。

如果您恰好位于POSIX系统上,可以查看mmapshm_open

答案 1 :(得分:2)

如果您使用的是几乎任何操作系统,那么就会有virtual memory的概念。因此,一个进程中的某个内存地址在另一个进程中不一定相同。即使它确实通过一些纯粹的机会映射到相同的物理地址,然后通过尝试阅读它,您希望获得segmentation fault,因为您正在访问该进程不“拥有”的内存。 / p>

答案 2 :(得分:0)

我相信这永远不会奏效。

在程序A中,“hello”是可执行文件附带的字符串,并在您调用该程序时加载到内存中。