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

#c #pointers #struct

#c #указатели #структура

Вопрос:

Допустим, я использую 2 структуры в C, например:

 struct department {
    char name[10];
    int floor;
}

struct person {
    char name[10];
    struct department *dep;
};
  

Что происходит под капотом при доступе к переменной person_1 person такого типа:
(person_1.dep)->floor .
Сначала dep разыменовывается указатель, но после этого первые 10 имени отдела просто пропускаются, чтобы получить 4 байта этажа, или есть что-то еще?

Спасибо!

Комментарии:

1. «первые 10 имени отдела просто пропущены». В общем, это в значительной степени так. Хотя есть дополнительные соображения по выравниванию, которые могут привести к заполнению между полями. В этом случае, floor вероятно, будет 12 байт, а не 10 байт с самого начала.

2. Да, хотя с технической точки зрения количество байтов в floor зависит от вашей платформы.

3. Предполагая, что не было дополнительного заполнения, что маловероятно, если вы не добавили атрибут packed ранее. Тогда, да, он пропустит первые 10 байтов для получения floor .

4. Уже person_1.dep делает то же самое внутренне. Он принимает адрес person_1 в стеке и добавляет 10 (или 12 или 16) к этому адресу перед чтением dep указателя. Затем то же самое делается при разыменовании.