@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 гласит:
Внутри объекта структуры члены без битовых полей и блоки, в которых находятся битовые поля, имеют адреса, которые увеличиваются в порядке их объявления. Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент (или, если этот элемент является битовым полем, затем на модуль, в котором он находится), и наоборот. Внутри объекта структуры может быть безымянный отступ, но не в его начале.
Я предположил, что если бы смещение элемента в структуре было суммой размеров элементов, объявленных до него, то между этими элементами не могло бы быть дополнения, и они должны быть расположены последовательно, образуя массив, если они были одного типа.
Вопрос в том, является ли приведенное выше предположение неверным, и почему оно так (какие комментарии по контрольному вопросу позволяют думать), почему?