int main(){
int pid;
int num=1;
pid=fork();
if(pid>0){
num++;
printf("in parent:num:%d addr:%x\n",num,&num);
}
else if(pid==0){
printf("in child:num:%d addr:%x\n",num,&num);
}
}

正确答案: B 你的答案: D (错误)

  1. 父子进程中输出的num相同,num地址不相同
  2. 父子进程中输出的num不同,num地址相同
  3. 父子进程中输出的num相同,num地址也相同
  4. 父子进程中输出的num不同,num地址不相同

解析:
虚拟地址空间。num地址的值相同,但是其真实的物理地址却不一样。
linux下实现了一下,发现地址值真的一样。
fork之后子进程复制了父进程的数据、堆栈。
但是由于地址重定位器之类的魔法存在,
所以,看似一样的地址空间(虚拟地址空间),
其实却是不同的物理地址空间。
同时可以验证c程序中输出的地址空间其实都是虚拟地址空间。