1

我的进程正在访问已创建的共享内存。附加到共享内存的指针是一个包含一个指针和 2 或 3 个变量的结构。

例如:

typedef struct _info_t{
    int id;
    char c;
}info_t;

typedef struct _details_t{
    int buff_id;
    info_t* info;
}details_t;

details_t* details = shmat(shmid,(void*)0,0);
printf("\n %d \n",details->info->id);            // gives me a segmentation fault
4

2 回答 2

5

如果一个内存段在多个进程之间共享,则无法保证它将映射到同一地址,因此您不能将指针存储在共享内存段中。尽量避免使用指针,使用偏移量或数组(如果可能)。

于 2013-09-15T17:05:45.293 回答
1

shmat(2)是一个系统调用(在 Linux 上)。它可能会失败。所以至少代码

details_t* details = shmat(shmid,(void*)0,0);
if (!details) { perror("shmat"); exit(EXIT_FAILURE); };  

并且您不能(轻松)将指针放在共享内存中,因为地址特定于每个进程。

于 2013-09-15T17:06:02.907 回答