为什么没有向另一个进程提供对内存位置的访问权限
Why no access to a memory location is given to another process?
我有三个C代码。在第一个代码 c0.c 中,整数指针 (p) 是动态分配的内存,用于保存一个整数值。值 325 被分配给此指针变量 (p) 指向的内存。此指针的整数值存储在文件中。在不解除分配内存的情况下,此指针变量 (p) 被分配一个 NULL 值。然后,整数值再次读入长变量 (i),指针变量 (p) 被赋予该变量 (i) 的 (int*) 值。取消引用并打印时,它将打印值 325。代码如下所示。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)malloc(sizeof(int));
*p = 325;
FILE *F;
F = fopen("xxx", "w");
fprintf(F, "%ld", (long)p);
fclose(F);
p = NULL;
long i;
F = fopen("xxx", "r");
fscanf(F, "%ld", &i);
p = (int*)i;
fclose(F);
printf("value stored in read pointer = %dn", *p);
return(0);
}
现在尝试使用两个单独的文件 c1.c 和 c2.c 做同样的事情。在 c1.c 中,指针 p 被分配内存,值 325 存储在它指向的内存中。指针的整数值存储在文件中,程序执行由扫描暂停。在 c2.c 中,指针的整数值被读取并分配给另一个整数指针。取消引用此指针变量,并尝试打印值。预计输出为 325。因此,当 c1.c 编译并运行时,它暂停了,c2.c 的编译可执行文件将运行。它崩溃了。为什么?
C1.c和C2.c如下。
c1.c:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)malloc(sizeof(int));
*p = 325;
FILE *F;
F = fopen("xxx", "w");
fprintf(F, "%ld", (long)p);
fclose(F);
int j;
scanf("%d", &j); // To pause the program and run c2.c executable
return(0);
}
c2.c:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
long i;
FILE *F;
F = fopen("xxx", "r");
fscanf(F, "%ld", &i);
p = (int*)i;
fclose(F);
printf("value stored in read pointer = %dn", *p);
return(0);
}
所有现代操作系统都使用虚拟内存。在虚拟内存中,每个进程都有自己的虚拟地址空间。虚拟地址空间分为两个不同的区域:用户空间和系统(或内核)空间。
所有进程的系统空间都相同。但是,它不能从用户模式写入,并且大多数地址无法从用户模式读取或执行。
用户模式地址空间(可以处理的部分)对于每个进程都是唯一的。一个进程中的地址 1000 通常与另一个进程中的地址 1000 不同。
通常可以创建可由多个进程访问的共享内存区域。但是,这些可以映射到不同的虚拟地址。在共享内存区域中,地址 1000 处的更改在一个进程中,可以在另一个进程中的地址 2000000 处看到。
当您读取一个进程写入的地址值并尝试在另一个进程中访问它们时,这些地址将无法访问并且正在崩溃。如果无法访问,则表示尚未在进程的虚拟地址空间中创建这些地址。即使创建了它们,它们也不会与其他进程中的内存相同。
您的操作系统使用虚拟地址空间进行进程隔离。
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 内存所有位置 wxWidgets
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何识别内存泄漏的位置
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- delete如何知道对象在内存中的起始位置
- 无法在 Opencv 中显示图像导致内存位置
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"