#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
указателя. Затем то же самое делается при разыменовании.