Понимаю, что название темы кажется странным, но тем не менее...
Имеем такой код (синтетический тест воспроизводящий проблему)
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned int i = 0;
unsigned char buf1 [13] = {0xAA, 0xAB, 0xAC, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00 }; // (см *)
for (i = 3; i < sizeof(buf1); ++i) {
printf("%02x:", buf1[i]);
}
printf("\n");
for (i = 3; i < sizeof(buf1); i+=2) {
printf("%04x:", *(unsigned short *)&buf1[i]);
}
printf("\n");
for (i = 0; i < 4; i++) {
printf("%04x:", *(unsigned short *)&buf1[i]);
}
printf("\n");
return 0;
}
Компилируем для платформы x86, получаем вполне ожидаемый выводЦитата
01:00:02:00:03:00:04:00:05:00:
0001:0002:0003:0004:0005:
abaa:acab:01ac:0001:
Компилирую для arm (-mcpu=arm926ej-s -march=armv5te), получаю следущее0001:0002:0003:0004:0005:
abaa:acab:01ac:0001:
Цитата
01:00:02:00:03:00:04:00:05:00:
01ac:0200:0300:0400:0500:
abaa:abaa:01ac:01ac:
01ac:0200:0300:0400:0500:
abaa:abaa:01ac:01ac:
Как можно объяснить такой вывод, и, самое главное, как заставить именно этот код вести себя ожидаемо (как на x86)?
* Важный момент, что размер массива нечётный. При выравнивании 1, если сразу объявить еще один такой же массив и повторить для него те же действия, вывод для него будет отличаться, но всё равно не будет правильным (т.е. таким же как на x86).