直接从整数制作指针

Directly make pointer from ints

我正在学习共享内存,我想将一个指向结构变量的地址从一个进程发送到另一个进程。

我所做的是将变量的地址写入共享内存,打印地址,然后通过无限循环使进程保持活动状态。这个进程将被称为进程1。代码:

    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
    sprintf(ptr, "%p", &temp);

之后,我从另一个进程(进程 2)读取地址作为 char 数组,然后我将它转换为 long int,使用此代码

    sscanf((char*) ptr, "%lx", &intVal);

然后我直接给这个结构体的指针赋值:

    student* p = intVal;

但是当我尝试访问内存区域时,它会产生一个分段错误,尽管当我 运行 这一行

    printf("variable A is at address: %p\n", p);

它打印进程 1 的确切地址。

那么为什么即使我让两个进程都保持活动状态,C 仍会出现分段错误?

欢迎来到 virtual memory,每个进程都有自己的地址 space。

位于一个进程中一个地址的内容与位于不同进程中相同地址的内容完全无关。这意味着一个进程不能有意或无意地写入另一个进程使用的内存。阅读也是如此。

这对稳定性很有帮助。一个行为不当的程序不会使整台机器崩溃。这也允许不同的用户具有不同的权限。