Что стандарт 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 передает под мандат это, чтобы всегда оценить верный?

10
задан James Morris 13 June 2010 в 08:34
поделиться

3 ответа

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

.
12
ответ дан 3 December 2019 в 20:40
поделиться

Не могу найти его в стандарте C, но ответ «да» - в стандарте C ++ сказано:

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

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

5
ответ дан 3 December 2019 в 20:40
поделиться

Да.

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

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

ресурс

1
ответ дан 3 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: