@Lundin: Сообщение отредактировано, и спасибо за обратную связь. Я уже проголосовал за ваш ответ, и ваш комментарий помог мне лучше понять обоснование этого.

етика указателей между последовательными членами одного и того же типа в структуре была обычной практикой, в то время как арифметика указателей действительна только внутри массива. В C ++ это было бы явно неопределенным поведением, потому что массив может быть создан только объявлением или новым выражением. Но язык C определяет массив какнепрерывно распределенный непустой набор объектов с определенным типом объекта-члена, называемый типом элемента. (осадка n1570 для C11, типы 6.2.5 §20). Таким образом, при условии, что мы можем убедиться, что члены являются последовательными (то есть между ними нет отступов), было бы законно рассматривать это как массив.

Вот упрощенный пример, который компилируется без предупреждения и дает ожидаемые результаты во время выполнения:

#include <stdio.h>
#include <stddef.h>
#include <assert.h>

struct quad {
    int x;
    int y;
    int z;
    int t;
};

int main() {
    // ensure members are consecutive (note 1)
    static_assert(offsetof(struct quad, t) == 3 * sizeof(int),
        "unexpected padding in quad struct");
    struct quad q;
    int *ix = &q.x;
    for(int i=0; i<4; i++) {
        ix[i] = i;
    }
    printf("Quad: %d %d %d %d\n", q.x, q.y, q.z, q.t);
    return 0;
}

Это на самом деле не имеет смысла, но я уже видел пример из реальной жизни, где итерации среди членов структуры позволяют более простой код с меньшим риском опечатки.

Вопрос:

В приведенном выше примере этоstatic_assert достаточно, чтобы сделать легальным псевдоним структуры с массивом?

(примечание 1) Как структураописывает последовательно распределяемый непустой набор объектов-членовболее поздние участники должны иметь увеличивающиеся адреса. Просто компилятор может включать отступы между ними. Итак, смещение последнего члена (здесьt) если 3 разаsizeof(int) плюс общее заполнение перед ним. Если смещение точно3 * sizeof(int) тогда в структуре нет заполнения

Вопрос, предложенный в виде дубликата, содержит как принятый ответ, позволяющий думать, что это будет UB, так и+1 ответ что позволяет думать, что это может быть законно, потому что я мог бы гарантировать, что никакие отступы не могут существовать

Ответы на вопрос(5)

Ваш ответ на вопрос