C 当从两个不同的进程访问时,为什么共享内存值会发生变化?
我在父母和孩子之间创造一个共享的记忆。然后,我从子级向共享内存写入一个值,并从父级读取该值。但价值观是不同的。代码如下:C 当从两个不同的进程访问时,为什么共享内存值会发生变化?,c,pointers,shared-memory,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;
#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;
}
#包括
#包括
#包括
int main()
{
int seg_id,pid;
int fib1=1,fib=1,温度;
inti,tempsize;
int*结果;
seg_id=shmget(IPC_PRIVATE,8,S_IRUSR | S_IWUSR);
结果=(int*)shmat(seg_id,NULL,0);
printf(“输入大小\n>”;
scanf(“%d”、&tempsize);
pid=fork();
如果(pid==0)
{
对于(i=0;i0)
{
等待(0);
printf(“%p\n”,结果);
}
返回1;
}
以下是输出:
输入大小5
fib值13
子项中的结果为0xd
已完成的子项
0xb778f000 如您所见,从子级和父级打印时,结果打印的值不同。为什么会这样 我还试着做:
result=&fib
但这样做总是在两个进程中打印结果的地址(同样不同)。值相同,十进制13等于十六进制0xD。输出不同,因为格式代码不同:父级使用%d
,以十进制表示数字,而子级使用%p
,以十六进制表示值
使用
%p
是不正确的,它意味着指针,如果void*
与int
的大小不同,则会给出错误的输出。它在这种情况下工作,您可以使用%x
(或%x
)代码可靠地获得十六进制输出。首先将其打印为带符号的int
%d
,然后作为指针%p
。int
值是13
,当以十六进制打印为指针时,13
是d
除了其他答案外,result=fib表示将int指针的地址设置为fib的值。如果试图在结果中存储fib的值,则需要*result=fib
。如果运行代码,您将看到父级和子级中的地址都相同
因此,如果希望在父级和子级中查看计算值,请更改为
*result = fib;
printf("result in child is %d\n", *result);
printf("result in parent is %d\n", *result);
产量
Enter size
5
fib value 13
result in child is 13
child done
result in parent is 13
查看结果是整数指针,以及如何为结果赋值
它应该是*result=fib您正在将结果写入指针的地址,而不是值。使用
*结果=fib代码>(注意星号)写入指针的值。同样,在printf中使用*result
和%d
,而不是result
/%p
。注意:int fib=1;int*结果;结果=fib代码>应生成警告。确保编译器的警告已完全启用,以加快问题识别。