所以我有这个问题,我想向共享内存中添加“一个”结构和一个int 而且我想让我的“ int位于共享内存的第一个位置”(因为在其他程序中我将需要此int),然后具有结构 这是我的代码
int id = shmget( 0x82488, (sizeof(student)) + sizeof(int) ,IPC_CREAT | 0666 );
exit_on_error (id, "Error");
int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");
Student *s = shmat(id,0,0);
exit_on_null (s,"Error");
现在出现了我的问题,因为我有2个指针,我应该如何使int成为第一个,然后使结构成为
p[0]=100 s[1] = (new Student)
答案 0 :(得分:-1)
我会做
int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");
Student *s = (Student*)(void*)(p + 1);
因此,s
指向下一个整数(如果该整数为整数)的位置。
这有点棘手,但是它清除了结构中可能存在的所有可能的填充字节与互操作的问题。
示例:
+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
在这种情况下,p
指向位置0(相对于缓冲区的开始),因此p + 1
指向位置4(如果int
具有32位)。用我的方式投掷p + 1
使s
跳到这个地方,但类型为Student *
。
如果要添加结构struct extension
,请执行以下操作:
struct extension *x = (struct extension*)(void*)(s + 1);
它指向Struct
的后面,并且再次具有正确的指针类型。