C短数组\\’reversed \\’在转换为整数时

C++ short array 'reversed' when casted to integer

作为C语言的新手,我一直在玩指针。我编写了以下代码以将短数组解释为整数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
int main(){
    short array[2] = {10, 9};

    short* pointer = array;
    std::cout << pointer <<":" << *pointer << std::endl;
    // 0xffffcbdc: 10

    pointer++;
    std::cout << pointer <<":" << *pointer << std::endl;
    // 0xffffcbde: 9

    int* pointer2 = (int*) array;
    std::cout << pointer2 <<":" << *pointer2 << std::endl;
    // 0xffffcbdc: 589834
}

为什么整数589 \\'834(0009 000A)而不是655 \\'369(000A 0009)的值?

从打印的指针地址看来,数组在内存中看起来是有序的,为什么要强制转换为整数会改变它呢?


此行为是未定义的:

1
int* pointer2 = (int*) array;

仅当T2的对齐要求与T1的对齐要求相同或更严格时,才允许将指向T1的指针重新解释为指向T2的指针(有关更多详细信息,请参见参考资料)。由于int的对齐要求比short的对齐要求严格,因此指针重新解释无效。

请注意,将指向int的指针重新解释为指向short的指针将是有效的。

注意:由于未定义行为,因此您的程序可以执行任何操作,包括打印不正确的值甚至崩溃。但是,最常见的原因是您的系统在较低的地址存储了较高整数的字节。这是两个常用选项之一:第二个选项是在较高的地址上存储较高的字节。这两个选项称为字节序。有关更多信息,请参见此处。


您正在执行的操作是不确定的行为,因为您违反了严格的别名规则。因此,不要理会从中获得的任何输出。