Рассмотрите следующие два 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 передает под мандат это, чтобы всегда оценить верный?
Да, согласно пункту 6.7.2.1: "Внутри объекта структуры члены, не являющиеся битовыми полями, и единицы, в которых находятся битовые поля, имеют адреса, которые увеличиваются в порядке их объявления. Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный член (или, если этот член является битовым полем, то на единицу, в которой он находится), и наоборот. Внутри объекта структуры могут быть безымянные вставки, но не в его начале"
.Не могу найти его в стандарте C, но ответ «да» - в стандарте C ++ сказано:
Указатель на объект POD-структуры, соответствующим образом преобразованный с использованием reinterpret_cast, указывает на свой начальный член (или если этот член является битовое поле, затем в блок, в котором он находится) и наоборот. [Примечание: Следовательно, может быть безымянный заполнение внутри объекта POD-структуры, но не в начале, как необходимо для достижения соответствующего выравнивания. ]
Поскольку объекты C и C ++ POD должны быть совместимы, то же самое должно быть верно и для C.
Да.
Перед первым элементом не должно быть никаких отступов.
Адрес структуры такой же, как адрес ее первого члена, при условии, что используется соответствующее приведение.