2

通常一个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]ca[1]

那么这段代码是否如预期的那样正确,是否建议这样做?我想要一个可移植的方法,它可以将字节数组中的任意两个字节作为短变量读取,以便在几乎所有平台/编译器中都能正常工作。

非常感谢。

4

1 回答 1

4

没有“必须”,它只是 CPU 可以或不能做的事情。特别是 x86 可能能够进行“未对齐”访问,尽管几乎可以肯定它的效率较低。

对其他 CPU 架构的可移植性可能是您关心的问题,也可能不是,但通常应避免未对齐的内存访问。另外,你几乎必须欺骗编译器,甚至让你做错位的事情......就像你乞求它“拜托,拜托,拜托,但我真的想在脚上开枪,请让我这样做”;这通常不是您可以意外做的事情。

于 2012-07-05T06:42:28.460 回答