memory-alignment
Table of Contents
1 Conclusion
Make sure memory alignment by 4 bytes. Especially for Embedded development.
2 Test Program
#include <stdio.h> // not alignment for 4B int main() { int i = 0; unsigned char buf[8]; for (i = 0; i < 8; i++) { buf[i] = i; printf("buf[%d] = 0x%x\n", i, buf[i]); } for (i = 0; i < 5; i++) printf("*(int *)&buf[%d] = 0x%x\n", i, *(int *)&buf[i]); return 0; }
3 Memory Alignment in ubuntu14.04 i386
3.1 kernel version
3.13.0-62-generic
3.2 result
buf[0] = 0x0 buf[1] = 0x1 buf[2] = 0x2 buf[3] = 0x3 buf[4] = 0x4 buf[5] = 0x5 buf[6] = 0x6 buf[7] = 0x7 *(int *)&buf[0] = 0x3020100 *(int *)&buf[1] = 0x4030201 *(int *)&buf[2] = 0x5040302 *(int *)&buf[3] = 0x6050403 *(int *)&buf[4] = 0x7060504
4 Memory Alignment in Arm DM368
4.1 kernel version
2.6.37IPNCDM3685.1.0R001
4.2 result
buf[0] = 0x0 buf[1] = 0x1 buf[2] = 0x2 buf[3] = 0x3 buf[4] = 0x4 buf[5] = 0x5 buf[6] = 0x6 buf[7] = 0x7 *(int *)&buf[0] = 0x3020100 *(int *)&buf[1] = 0x30201 *(int *)&buf[2] = 0x1000302 *(int *)&buf[3] = 0x2010003 *(int *)&buf[4] = 0x7060504
we can see when we reference 4B content from &buf1, &buf2 and &buf3, we get the wrong value.