是否可以关闭此功能以允许不同的程序通过 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 的内存地址访问同一块?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以保存 Twitter 密码以便通过 Twitter API 轻松登录? [关闭]