从两个不同的进程访问时,为什么共享内存值会发生变化?

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)代码可靠地获得十六进制输出.