Что говорит стандарт C о указателях на структуры и их первом члене?

Рассмотрим следующие два struct:

struct a
{
    int a;
};

struct b
{
    struct a a_struct;
    int b;
};

следующее инстанцирование struct b:

struct b b_struct;

и это условие:

if (&b_struct == (struct b*)&b_struct.a_struct)
    printf("Yes\n");

Обязателен ли стандарт C, чтобы всегда оценивать истину?

Ответ 1

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

Ответ 2

Невозможно найти его в стандарте C, но ответ "да" - в стандарте С++ говорится:

Указатель на объект POD-struct, соответствующим образом преобразовываться с использованием reinterpret_cast указывает на его (или если этот член является бит-поле, затем в блок, в котором он находится) и наоборот. [Заметка: Поэтому может быть неназванный заполнение в объекте POD-struct, но не в самом начале, по мере необходимости для достижения соответствующего выравнивания. ]

Поскольку объекты C и С++ POD должны быть совместимы, то же самое должно быть верно для C.

Ответ 3

Да.

Не должно быть никаких дополнений перед первым элементом.

Адрес структуры совпадает с адресом его первого элемента при условии, что используется соответствующий литой.

ресурс