【发布时间】:2018-07-03 09:34:12
【问题描述】:
我只是不明白为什么这段代码会以它的方式工作(而不是我期望的):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{
int buffer;
int* address;
address=&buffer;
if(fork()==0)
{
*address=27;
printf("Address %ld stores %d\n",(long)address,*address);
exit(0);
}
wait(NULL);
printf("Address %ld stores %d\n",(long)(&buffer),buffer);
return 0;
}
为什么即使指向同一个内存地址,系统也会存储不同的变量?
注意:我从没想过这段代码能正常工作,否则一大堆管道和东西就没有任何意义;我只是想了解这里发生了什么。
【问题讨论】:
-
你的输出是什么,你期望什么?我希望
buffer有一个垃圾值,这就是我得到的:ideone.com/ESqx1I -
你必须熟悉物理和虚拟内存地址的区别
-
@mch 这也是我得到的,读起来感觉很奇怪:内存地址 X 存储 27,内存地址 X 存储 0(我的意思是,假设 X=X...)
-
@Ctx 看起来我正在考虑虚拟内存,就好像它是物理内存一样。有没有办法强制进程写入特定的物理地址?
-
@Guillermo.D.S.没有可移植的方式来写入特定的物理地址,但无论如何我都看不到这样做的充分理由。还有其他机制可以在进程之间共享内存,例如(线程、posix 共享内存等)。
标签: c memory-management shared-memory