Предположим этот код:
unsigned char list[3] = { 1, 2, 3 };
struct _struct{
unsigned char a;
unsigned char b;
unsigned char c;
} *s;
s = ( _struct * ) list;
Я могу всегда принимать это s->a == 1, s->b == 2, s->c == 3
?
Или это будет зависеть от порядка байтов системы или выравнивания памяти?
Давайте рассмотрим это.
Во всех случаях sizeof (char) == 1
, а массив list
будет иметь три элемента в ячейках памяти list
, list + 1
и list + 2
.
Ситуация со структурой
не так ясна. Стандарт гарантирует, что элементы будут размещены в увеличивающихся ячейках памяти, но не будут непрерывными. Компилятор может вводить отступы между членами и отступы в конце.
Следовательно, s-> a == 1
всегда будет истинным. Если реализация помещает unsigned char
в структуру struct
рядом (и большинство из них), тогда другие равенства обязательно будут истинными.
Кстати, вызов структуры struct
_struct
может вызвать проблемы. Имя, начинающееся с подчеркивания в глобальном пространстве имен, зарезервировано для реализации.
Да, это будет зависеть от правил выравнивания и упаковки памяти системы и компилятора.