gpt4 book ai didi

c - 使用 fork() 在子进程和父进程中创建的不同数组具有相同的逻辑地址

转载 作者:行者123 更新时间:2023-11-30 18:48:20 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

void forkexample()
{
int x = 1;

if (fork() == 0)
{
//printf("this is Child ");
++x;
printf("addr of x=%p\n",&x );
int* arr1=(int*)malloc(sizeof(int)*5);
*arr1=5;
printf("Addr of child arr1=%p arr1[0]=%d\n",&arr1,arr1[0] );
}
else
{
//printf("this is parent ");
--x;
printf("addr of x=%p\n",&x );
int* arr2=(int*)malloc(sizeof(int)*5);
*arr2=6;
printf("Addr of parent arr2=%p arr2[0]=%d\n",&arr2,arr2[0] );
}
}
int main()
{
forkexample();
return 0;
}

screenshot of output

为什么&arr1=&arr2?

我知道操作系统将使用写时复制(COW)方法为子进程创建新的地址空间,并且“&”给出逻辑地址,但在这里我们动态创建两个不同的数组。

最佳答案

arr1arr2 不是数组,它们是指针。您正在打印 forkexample 中的局部变量的地址,就像 x 一样。如果想查看malloc返回的内存地址,需要printf("%p", arr1),而不是&arr1 .

据推测,编译器决定对 arr1arr2 使用相同的存储,因为变量的范围不重叠。您可以通过将代码更改为来测试这个理论:

void forkexample(void) 
{
int x = 1;
{
++x;
printf("addr of x=%p\n", (void *)&x);
int *arr1 = malloc(sizeof(int)*5);
*arr1 = 5;
printf("Addr of child arr1=%p arr1[0]=%d\n", (void *)&arr1, arr1[0]);
}
{
--x;
printf("addr of x=%p\n", (void *)&x);
int *arr2 = malloc(sizeof(int)*5);
*arr2 = 6;
printf("Addr of parent arr2=%p arr2[0]=%d\n", (void *)&arr2, arr2[0]);
}
}

...并查看 arr1arr2 是否仍然具有相同的地址。

<小时/>

旁注:printf %p 采用 void *,而不是 int * int ** (这就是您要传递的内容)。您需要进行强制转换: printf("%p\n", (void *)&arr1);

关于c - 使用 fork() 在子进程和父进程中创建的不同数组具有相同的逻辑地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46262264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com