Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么另一个进程不能访问内存位置?_C++_C_Memory Management - Fatal编程技术网

C++ 为什么另一个进程不能访问内存位置?

C++ 为什么另一个进程不能访问内存位置?,c++,c,memory-management,C++,C,Memory Management,我有三个C代码。在第一个代码c0.c中,一个整数指针(p)被动态分配给内存,用于保存一个整数值。将值325分配给该指针变量(p)指向的内存。此指针的整数值存储在文件中。在不释放内存的情况下,此指针变量(p)被分配一个空值。然后将整数值再次读入长变量(i)中,并将该变量(i)的(int*)值分配给指针变量(p)。取消引用并打印时,它打印值325。代码如下所示 #include <stdio.h> #include <stdlib.h> int main() { int

我有三个C代码。在第一个代码c0.c中,一个整数指针(p)被动态分配给内存,用于保存一个整数值。将值325分配给该指针变量(p)指向的内存。此指针的整数值存储在文件中。在不释放内存的情况下,此指针变量(p)被分配一个空值。然后将整数值再次读入长变量(i)中,并将该变量(i)的(int*)值分配给指针变量(p)。取消引用并打印时,它打印值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 = %d\n", *p);

  return(0);
}
#包括
#包括
int main()
{
int*p=(int*)malloc(sizeof(int));
*p=325;
文件*F;
F=fopen(“xxx”,“w”);
fprintf(F,“%ld”,(长)p);
fclose(F);
p=零;
龙我;
F=fopen(“xxx”、“r”);
fscanf(F、%ld、&i);
p=(int*)i;
fclose(F);
printf(“读取指针中存储的值=%d\n”,*p);
返回(0);
}
现在使用两个单独的文件c1.c和c2.c尝试同样的事情。在c1.c中,指针p被分配给内存,值325被存储在它所指向的内存中。指针的整数值存储在一个文件中,程序执行被scanf暂停。在c2.c中,指针的整数值被读取并分配给另一个整数指针。取消引用此指针变量,并尝试打印该值。预计产量为325。因此,当c1.c被编译并运行时,它会暂停,c2.c编译后的可执行文件就会运行。它崩溃了。为什么?

c1.c和c2.c如下所示

c1.c:

#包括
#包括
int main()
{
int*p=(int*)malloc(sizeof(int));
*p=325;
文件*F;
F=fopen(“xxx”,“w”);
fprintf(F,“%ld”,(长)p);
fclose(F);
int j;
scanf(“%d”,&j);//暂停程序并运行c2.c可执行文件
返回(0);
}
c2.c:

#包括
#包括
int main()
{
int*p;
龙我;
文件*F;
F=fopen(“xxx”、“r”);
fscanf(F、%ld、&i);
p=(int*)i;
fclose(F);
printf(“读取指针中存储的值=%d\n”,*p);
返回(0);
}

所有现代操作系统都使用虚拟内存。在虚拟内存中,每个进程都有自己的虚拟地址空间。虚拟地址空间分为两个不同的区域:用户空间和系统(或内核)空间

所有进程的系统空间都是相同的。但是,它不能从用户模式写入,并且大多数地址不能从用户模式读取或执行

用户模式地址空间(您可以处理的部分)对于每个进程都是唯一的。一个进程中的地址1000通常与另一个进程中的地址1000不同

通常可以创建可由多个进程访问的共享内存区域。但是,这些可以映射到不同的虚拟地址。在共享内存区中,地址1000处的一种更改 在一个过程中,可在另一个过程中的地址2000000处看到


当您读取由一个进程写入的地址值并尝试在另一个进程中访问它们时,这些地址将无法访问并崩溃。通过“不可访问”,这些地址尚未在进程的虚拟地址空间中创建。即使创建了它们,它们也不会与其他进程中的内存相同。

您的操作系统使用for.

来保护您自己。单独的进程不共享内存。只有在使用共享内存的情况下才能这样做。不清楚实际问题是什么。“这不是因为孤立的地址空间”似乎是一个微不足道的答案。当只有一个程序访问给定的(物理)内存位置时,要让程序正确运行已经足够困难了;当有多个程序访问一个给定的内存位置时,这会变得更加困难。你必须协调通道,这需要工作。这是可以做到的,但需要小心并使用旨在实现这种“进程间通信”(IPC)的设施。
#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);
}
#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 = %d\n", *p);
  return(0);
}