C 以下哪些值在父进程和子进程中绝对相同?
考虑下面的程序C 以下哪些值在父进程和子进程中绝对相同?,c,pointers,process,fork,memory-address,C,Pointers,Process,Fork,Memory Address,考虑下面的程序 int dataA[8]; int func(int i) { return i; } int main(int argc, char** argv) { int *dataB = malloc(1); fork(); int *dataC = malloc(1); int (*func_ptr)(int i) = &func; return 0; } 以下哪些值在父进程和子进程中绝对相同?假定 这个fork()不会失败 &达塔 &数据库 &数据中心 数据中
int dataA[8];
int func(int i) {
return i;
}
int main(int argc, char** argv)
{
int *dataB = malloc(1);
fork();
int *dataC = malloc(1);
int (*func_ptr)(int i) = &func;
return 0;
}
以下哪些值在父进程和子进程中绝对相同?假定
这个fork()不会失败
有人能解释一下,通常是什么导致子进程中的指针地址不同吗?我认为混淆点在于共享/非共享内存空间 如果您分叉一个进程,子进程将是父进程的副本。子级和父级的唯一区别是
fork
的返回值。
这意味着堆也将处于相同的状态。
因此,如果在fork之后,子级和父级调用malloc
,它们将是相同的地址。
但是,它们不会指向相同的内存,这是因为子级不与其父级共享(默认情况下)内存
因此,如果dataC
在两个进程中具有“相同”的ptr值,则它们都指向不同的物理地址。
事实上,所有的指针都会
你可以对你的程序做一些小的改动来测试这一点
#包括
#包括
#包括
int dataA[8];
int func(int i){
返回i;
}
int main(int argc,字符**argv)
{
int*dataB=malloc(1);
*数据b=2;
dataA[1]=7;
int-pid=fork();
int*dataC=malloc(1);
int(*func_ptr)(int i)=&func;
printf(“pid=%d\ndaaa=%p\ndaab=%p\ndaac=%p\nfunc\u ptr=%p\n”,pid和dataA、dataB、dataC、func\u ptr);
如果(pid!=0){
*dataC=5;
dataA[0]=3;
}
printf(“pid=%d\n*dataB=%d\n*dataC=%d\ndaaa[0]=%d\n”,pid,*dataB,*dataC,dataA[0]);
返回0;
}
这将产生如下结果:
pid = 26563
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 26563
*dataB = 2
*dataC = 5
dataA[0] = 3
pid = 0
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 0
*dataB = 2
*dataC = 0
dataA[0] = 0
&dataC
是堆栈上指针的地址。通常,堆栈布局在编译时确定,因此dataC
的地址将是相同的。但是dataC
中的值是运行时malloc
返回的值。这在父母和孩子之间可能是不同的,我明白了。如果C被简单地初始化为int C=3,那么我说C将被存储在堆栈中,那么&dataC将不同吗?我担心这个问题毫无意义。当你谈论C
时,你真的是指dataC
?是的,我指的是dataC。请注意,C标准中没有任何东西保证这种行为。事实上,C标准中没有关于堆栈的内容。因此答案1、2、3、5和6基于典型的桌面实现。并非在所有可能的实现中都是如此。