Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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_Pointers_Process_Fork_Memory Address - Fatal编程技术网

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()不会失败

  • &达塔
  • &数据库
  • &数据中心
  • 数据中心
  • func_ptr
  • &func_ptr
  • 答案是1,2,3,5和6。我不知道为什么&dataC会与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基于典型的桌面实现。并非在所有可能的实现中都是如此。