Приведение байтового массива к указателю структуры зависит от порядка байтов или выравнивания памяти? - PullRequest
7 голосов
/ 02 июня 2010

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

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

Ответы [ 2 ]

7 голосов
/ 03 июня 2010

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

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

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

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

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

4 голосов
/ 02 июня 2010

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

...