rit*_*att 3 c pointers shared-memory
我在父母和孩子之间创建共享内存.然后我从子进程向共享内存写一个值并从父进程中读取它.但价值观是不同的.这是代码:
#include <sys/shm.h>
#include <sys/stat.h>
#include <stdio.h>
int main()
{
int seg_id, pid;
int fib1 = 1, fib = 1, temp;
int i, tempsize;
int *result;
seg_id = shmget(IPC_PRIVATE, 8, S_IRUSR | S_IWUSR);
result = (int *) shmat(seg_id, NULL, 0);
printf("Enter size\n> ");
scanf("%d", &tempsize);
pid = fork();
if (pid == 0)
{
for(i = 0; i < tempsize; i++)
{
temp = fib;
fib = fib + fib1;
fib1 = temp;
}
printf("fib value %d\n", fib);
result = fib;
printf("result in child is %p\n", result);
printf("child done\n");
}
else if(pid > 0)
{
wait(0);
printf("%p\n", result);
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
输入大小为
5的
fib值13
结果在孩子是0xd
孩子完成
0xb778f000
如您所见,从子级和父级打印时,打印结果的值不同.为什么会这样?
我也尝试过这样做:
result = &fib但这样做总是会在两个进程中打印结果的地址(再次不同).
小智 6
值相同,十进制13等于十六进制0xD.输出不同,因为格式代码不同:父级使用%d,在子级使用%p时呈现十进制数,以十六进制呈现值.
使用%p不正确,它意味着指针,如果void *大小不同,将给出错误的输出int.它适用于这种情况,您可以使用%x(或%X)代码可靠地获得十六进制输出.