Что говорит стандарт 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
Да.
Не должно быть никаких дополнений перед первым элементом.
Адрес структуры совпадает с адресом его первого элемента при условии, что используется соответствующий литой.
ресурс