Data alignment in cross-platform C programming
在跨平台C语言编程中,数据对齐是一个要着重注意的问题。对于结构体(struct)中数据的对齐方式一般来说大家都已经很熟悉了,这里要讨论的是不同编译器对数组字节的对齐问题。
先看一段代码:
这段代码执行的是一个数据填充的功能,将数组的后两个字节填充为一个16位的数据0×5566。在PC上用GCC编译运行上面的代码,得到的输出为:
0 66 55
这个输出是符合期望的。(注:0×5566以little endian方式存储于内存中)
然而,用arm-linux-gcc编译运行以上代码时,得到了不同的输出:
66 55 0
出现这种情况的原因是,由于效率上的考虑,某些编译器会对一些特定数据会从特定地址进行存取,比如在这里对16位类型的数据编译器必须从偶数地址开始存取,若不是偶数地址会默认采取前挪的动作。因此数据往前移了一个字节。这种错误比较隐蔽往往难以发现,解决方法就是严格按字节进行存取。
在跨平台C语言编程中,对字节的存取应尤其小心,力求准确,否则就会像我一样调这种bug调了一天(望天
If you enjoyed this post, make sure you subscribe to my RSS feed!
8 Responses to Data alignment in cross-platform C programming
Leave a Reply Cancel reply
Subscribe
License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Tags
alignment android apache api app ArchLinux ARM C config Conky cross-platform daily DIY douban embedcover emerge endianness float gcc gdm gentoo gnome3 google ID3 ipv6 Java kernel life Linux list M9 mobile MoinMoin Music mutagen n1 netcfg network NexusOne onenow opensource Opera performance programming PythonRecent Comments
- r475 on Protected: 尘埃落定
- pipitu on Protected: 尘埃落定
- Omi on Protected: 尘埃落定
- pipitu on Protected: 尘埃落定
- lbt05 on Protected: 尘埃落定
DOUBAN.FM
Douban







)
你职业病又犯了。。。
身为IT民工居然能够容忍括号不闭合!
这是不对称美!
这个是syntax error: Unexpected EOF.
。。。。。
Unexpected EOF +1。不过还有一种东西叫括号自动配对……
碰到这种问题直接
typedef union tagUXXX
{
struct {
// ...
};
unsigned char ...;
} UXXX ;
#pragma pack()
了…已经懒得去纠结对齐了…