Цитата(kurtis @ May 23 2008, 19:54)

А как структуры выравнивать средствами языка Си???
J,sxyj в препроцессоре есть соответствующая #pragma
Например
Код
#pragma pack(2)
Код
#pragma pack()
Цитата(kurtis @ May 23 2008, 19:54)

Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Нужно просто понимать как CPU работает с памятью и к чему может приводить обращение к невыровненным структурам.
Допустим у вас 16-и разрядный CPU. Имеется массие из 5-и байт 1, 2, 3, 4, 5
Код
unsigned char mass[5]={1, 2, 3, 4, 5};
который по случайному стечению обстоятельств, расположился в памяти с нечетного адреса (без явного указания компилятор сделал так, как ему удобнее), т.е. невыровненных на границу машинного слова.
0x4001 0x01
0x4002 0x02
0x4003 0x03
0x4004 0x04
0x4005 0x05
Вы пытаетесь считать в 16-ти разрядную переменную третий и четвертый элемент байтового массива, думая, что в результате получите
0x0403.
Код
unsigned int var=(unsigned int *)&mass[2];
Но поскольку обращение к памяти возможно только по четному адресу, то в результате вы получите значение var
0x0302, либо
0x0504.