Код
#define PACK __attribute__ ((__packed__))
typedef struct
{
uint8_t a;
uint16_t b;
uint32_t d;
uint8_t c;
} PACK my_packed_struct;
void test(void)
{
my_packed_struct str;
my_packed_struct* pstr;
uint8_t* pa;
uint16_t* pb;
uint32_t* pd;
uint8_t* pc;
uint16_t q = 1;
pstr = &str;
pa = &(pstr->a);
pb = &(pstr->b);
pd = &(pstr->d);
pc = &(pstr->c);
*pb = q;
}
Пухнет и дохнет. uint32_t и uint16_t. Расположенны по нечётным адресам. Смотрел дебагером.
А ваш пример действительно работает, так как он начало структуры кладёт по нечётному адресу.
GCC-4.1.1 sam7x256
З.Ы.
Только что проверил такой код
Код
pstr = &str;
pa = &(pstr->a);
pstr->b = q;
pb = &(pstr->b);
pd = &(pstr->d);
pc = &(pstr->c);
*pb = q;
pstr->b = q; ---- работает, хотя pb после присваивания указывает на нечётный адрес.
вот дизасм кода.
Код
pstr->b = q;
100d80: e51b0024 ldr r0, [fp, #-36]
100d84: e55b100e ldrb r1, [fp, #-14]
100d88: e3a03000 mov r3, #0; 0x0
100d8c: e1a02003 mov r2, r3
100d90: e1a03001 mov r3, r1
100d94: e1823003 orr r3, r2, r3
100d98: e5c03001 strb r3, [r0, #1]
100d9c: e55b100d ldrb r1, [fp, #-13]
100da0: e3a03000 mov r3, #0; 0x0
100da4: e1a02003 mov r2, r3
100da8: e1a03001 mov r3, r1
100dac: e1823003 orr r3, r2, r3
100db0: e5c03002 strb r3, [r0, #2]
Отрадно конечно, но всё равно половина присваиваний в коде идёт через разыменование указателей.
Сообщение отредактировал xelax - Sep 7 2007, 08:21