是否可以关闭此功能以允许不同的程序通过 C 的内存地址访问同一块?

Posted

技术标签:

【中文标题】是否可以关闭此功能以允许不同的程序通过 C 的内存地址访问同一块?【英文标题】:Is it possible to turn off this feature to allow different programs access the same block via memory address with C? 【发布时间】:2022-01-21 21:43:35 【问题描述】:

我试图了解内存地址是如何工作的。这是代码。

#include <stdio.h>

int main()

    int i = 127, * p;
    p = &i;
    long j = 0;
    printf("%d\n", i);
    printf("%d\n", *p);
    printf("%p\n", (void*)&i);
    scanf("%lx", &j);
    p = (int *)j;
    printf("%d\n", *p);
    return 0;

我同时运行了 2 次代码,得到了 2 个正在运行的程序等待输入。

假设 program_1 给出 0x7ffd66359b78 而 program_2 给出 0x7ffc8b0d7af8

如果我为 program_1 输入 7ffd66359b78,我会得到 127

如果我为 program_1 输入7ffc8b0d7af8,我会得到

信号:分段错误(核心转储)

这意味着我在程序执行期间获得的内存地址仅适用于该程序的执行,我的理解是否正确?

我猜这是某种操作系统安全功能。它叫什么名字?是否可以关闭这个功能,让不同的程序通过内存地址访问同一个块?

【问题讨论】:

这些是虚拟地址,不是物理地址。每个进程都有自己的地址空间。如果您需要在两个进程之间共享一些内存空间,请阅读共享内存 这听起来像是未定义的行为。是什么让您认为long 可以在您的系统上保存地址?使用uintptr_t 而不是long 进程之间的内存共享取决于系统。在 unix 上,您可以使用 shmget,在 Windows 上,您还有其他 options 【参考方案1】:

这意味着我在程序执行期间获得的内存地址仅适用于该程序的执行,我的理解是否正确?

是的。

我猜这是某种操作系统安全功能。它叫什么名字?

最重要的是,virtual memory 和 ASLR。

基本上,简单来说,每个进程都有一个隐藏数字,在访问内存时会添加到地址中。 https://en.wikipedia.org/wiki/Memory_management_unit

是否可以关闭此功能,让不同的程序通过内存地址访问同一个块?

它叫shared memory,也叫https://en.wikipedia.org/wiki/Inter-process_communication#Approaches。

【讨论】:

这不能解释为什么他们在输入程序给他们的地址时会出现段错误。 long 在他们的系统上更有可能是 4 个字节,并且程序具有完全随机的行为。 @Lundin:如果这是真的,那么他们在第一种情况下,他们从同一个程序输入地址(如果我为 program_1 输入7ffd66359b78,我得到127),通常不会工作。

以上是关于是否可以关闭此功能以允许不同的程序通过 C 的内存地址访问同一块?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式关闭 iPhone?

win10内核隔离怎么关闭?

是否可以保存 Twitter 密码以便通过 Twitter API 轻松登录? [关闭]

MySQL 中的内存授权表的作用是啥

如何在 C 中取消设置变量以允许稍后使用具有不同数据类型的相同名称?

在 Android 上以编程方式关闭应用程序的通知