Объявленный тип буфера inotify_event - PullRequest
0 голосов
/ 18 марта 2019

Вот фрагмент примера, представленного в 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, который мы используем для доступа к объекту.

Одинаковые требования к выравниванию двух типов объектов не подразумевают их совместимость (насколько я могу судить).

Почему код соответствует? Что я пропустил?

...