Цитата(vinni-puch @ Jun 28 2011, 11:29)

Код
struct blabla {
char ch;
int that;
} blabla_t
При обращении к that и происходит, собсно, невыровненный доступ к памяти.
Не верю!
либо вы делаете примерно так:
Код
char *incomming_message;
.....
struct blabla *b;
b = (struct blabla *) incomming_message; /* Так делать нельзя, т.к. компилятор не может ничего узнать будет ли то, куда указывает incomming_message выровнено в памяти! */
b->that = 100500; /* Если incomming_message не было выровнено, то и на доступ внутри структуры тоже будет ошибка выравнивания */
Один из вариантов решения (ИМХО не лучший):
Код
char *incomming_message;
.....
struct blabla b;
memcpy(&b, incomming_message); /* Таким образом мы создаём копию данных, которые гарантированно выровнены в памяти */
b.that = 100500; /* В этом месте компилятор обязан сгенерировать код без невыровненных обращений */
ИМХО более надёжный путь декодировать данные, приходящие с внешних каналов, не наступая на грабли (aligned/BigEndian):
Код
int read_u8(uint8_t **message, size_t *len, uint8_t *retval){
if (*len >= sizeof(uint8_t) ){
*retval = **message;
*message += sizeof(uint8_t);
*len -= sizeof(uint8_t);
return 0; /* Ok */
}
return (-1); /* Fail */
}
int read_u16_LE(uint8_t **message, size_t *len, uint16_t *retval){
uint8_t msb;
uint8_t lsb;
if(read_u8(message, len, &lsb) < 0){
return (-1); /* Fail */
}
if(read_u8(message, len, &msb) < 0){
return (-1); /* Fail */
}
*retval = (msb << 8) | lsb;
return (0); /* Ok */
}
int read_u16_BE(uint8_t **message, size_t *len, uint16_t *retval){
uint8_t msb;
uint8_t lsb;
if(read_u8(message, len, &msb) < 0){
return (-1); /* Fail */
}
if(read_u8(message, len, &lsb) < 0){
return (-1); /* Fail */
}
*retval = (msb << 8) | lsb;
return (0); /* Ok */
}
как-то так =)