Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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_Shared Memory - Fatal编程技术网

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应生成警告。确保编译器的警告已完全启用,以加快问题识别。