通常,short
变量必须是2字节对齐地址,但如果我尝试将其指向奇数地址,是否有任何问题?
我在VC ++ 2008上尝试这个代码并运行正常,你能解释一下原因吗?
unsigned char ca[10];
unsigned short *s1 = 0;
memset(ca, 1, 10);
s1 = (unsigned short*)&ca[0];
printf("s1 = %d\n", *s1);
s1 = (unsigned short*)&ca[1];
printf("s1 = %d\n", *s1);
在上面的代码段中,ca[0]
或ca[1]
肯定有一个奇数地址,因此它不是2字节对齐,但s1
完全分配给ca[0]
{1}}和ca[1]
。
这段代码是否符合预期,是否建议以这种方式进行?我想有一个可移植的方法,它将字节数组中的任意两个字节读作一个短变量,以便在几乎所有平台/编译器中都能很好地工作。
非常感谢。
答案 0 :(得分:4)
没有“必须”,它只是CPU能够或不能做的事情。特别是x86可能会进行“错位”访问,尽管它几乎肯定效率较低。
其他CPU架构的可移植性可能是您可能关心的,也可能不是,但通常应该避免错位的内存访问。另外,你几乎不得不欺骗编译器甚至让你做错位的东西......就像你乞求它“请,拜托,拜托,但我真的想要自己拍脚,请让我这样做”';这通常不是你可以意外做的事情。