Я бы просто сделал
int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");
Student *s = (Student*)(void*)(p + 1);
, чтобы s
указывал на то, где будет следующий int, если это будет int.
Это немного сложно, но очищаетвсе возможные проблемы взаимодействия с возможными байтами заполнения в структуре.
Пример:
+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
В этом случае p
указывает на местоположение 0 (относительно начала буфера)и, таким образом, p + 1
указывает на позицию 4 (если int
имеет 32 бита).Приведение p + 1
, как я делаю, делает pont s
в это место, но имеет тип Student *
.
И если вы хотите добавить структуру struct extension
, вы делаете то же самое:
struct extension *x = (struct extension*)(void*)(s + 1);
Он указывает сразу за Struct
и, опять же, имеет правильный тип указателя.