Что стандарт C говорит об указателях на структуры и их первого члена? - PullRequest
10 голосов
/ 13 июня 2010

Рассмотрим следующие два 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 это всегда оценивать значение true?

Ответы [ 3 ]

12 голосов
/ 13 июня 2010

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

5 голосов
/ 13 июня 2010

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

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

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

1 голос
/ 13 июня 2010

Да.

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

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

ресурс

...