Кастинг массива байтов к указателю структуры зависит от выравнивания памяти или порядка байтов?

Предположим этот код:

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 ?
Или это будет зависеть от порядка байтов системы или выравнивания памяти?

7
задан Petruza 2 June 2010 в 20:27
поделиться

2 ответа

Давайте рассмотрим это.

Во всех случаях sizeof (char) == 1 , а массив list будет иметь три элемента в ячейках памяти list , list + 1 и list + 2 .

Ситуация со структурой не так ясна. Стандарт гарантирует, что элементы будут размещены в увеличивающихся ячейках памяти, но не будут непрерывными. Компилятор может вводить отступы между членами и отступы в конце.

Следовательно, s-> a == 1 всегда будет истинным. Если реализация помещает unsigned char в структуру struct рядом (и большинство из них), тогда другие равенства обязательно будут истинными.

Кстати, вызов структуры struct _struct может вызвать проблемы. Имя, начинающееся с подчеркивания в глобальном пространстве имен, зарезервировано для реализации.

7
ответ дан 6 December 2019 в 23:01
поделиться

Да, это будет зависеть от правил выравнивания и упаковки памяти системы и компилятора.

4
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

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