Вот фрагмент примера, представленного в man inotify(7)
:
static void handle_events(int fd, int *wd, int argc, char* argv[]){
//...
char buf[4096]
__attribute__ ((aligned(__alignof__(struct inotify_event))));
const struct inotify_event *event;
//...
ssize_t len;
char *ptr;
//...
len = read(fd, buf, sizeof buf);
//...
for (ptr = buf; ptr < buf + len;
ptr += sizeof(struct inotify_event) + event->len) {
event = (const struct inotify_event *) ptr; <---- CASTING HERE
//...other code accessing struct inotify_event *event omitted
}
}
Меня смутило то, что у нас есть объект с объявленным типом char[4096]
, но мы используем для доступа к нему значение через lvalue типа struct inotify_event
.
Применение 6.5(p7)
:
Объект должен иметь свое сохраненное значение, доступное только через lvalue
выражение, которое имеет один из следующих типов: 88)
- тип, совместимый с эффективным типом объекта
Стандарт позволяет преобразовывать указатель в символ в указатель в любой другой тип объекта (в данном случае struct inotify_event
).
Но для доступа к хранимому значению нам нужен эффективный тип, совместимый с lvalue, который мы используем для доступа к объекту.
Одинаковые требования к выравниванию двух типов объектов не подразумевают их совместимость (насколько я могу судить).
Почему код соответствует? Что я пропустил?