@SergeBallesta Массив должен иметь последовательные элементы, но только потому, что что-то имеет последовательные элементы, он не делает его типом массива. Я опубликовал ответ и на ваш другой вопрос.

родолжение этого другоговопрос

Я пытался установить во время компиляции, добавила ли конкретная реализация неназванный отступ внутри структуры. Конкретная реализация, такая как gcc, позволяет использовать прагмы для управления дополнением и выравниванием в структурах, но за счет совместимости с другими реализациями. Как обаstatic_assert а такжеoffset_of требуются в проекте n1570 для C11, я хотел бы использовать их, чтобы увидеть, использовала ли реализация заполнение между членами.

Вот соответствующая часть кода (полный код в указанном вопросе):

#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;
    ...

Как 6.7.2.1 Спецификаторы структуры и объединения § 15 гласит:

Внутри объекта структуры члены без битовых полей и блоки, в которых находятся битовые поля, имеют адреса, которые увеличиваются в порядке их объявления. Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент (или, если этот элемент является битовым полем, затем на модуль, в котором он находится), и наоборот. Внутри объекта структуры может быть безымянный отступ, но не в его начале.

Я предположил, что если бы смещение элемента в структуре было суммой размеров элементов, объявленных до него, то между этими элементами не могло бы быть дополнения, и они должны быть расположены последовательно, образуя массив, если они были одного типа.

Вопрос в том, является ли приведенное выше предположение неверным, и почему оно так (какие комментарии по контрольному вопросу позволяют думать), почему?

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

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