作为C ++的新手,我一直在玩指针。我编写了以下代码来将短数组解释为整数:
#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)的值?
从打印的指针地址看,数组在内存中按顺序排列,为什么转换为整数会改变那个?
答案 0 :(得分:8)
此行为未定义:
int* pointer2 = (int*) array;
只有当T1
的对齐要求与T2
的对齐要求相同或不太严格时,才允许将T2
的指针重新解释为指向T1
的指针(see reference for more details)。由于int
的对齐要求比short
的对齐要求更严格,因此指针重新解释无效。
请注意,重新解释指向int
的指针作为指向short
的指针是有效的。
注意:由于行为未定义,您的程序可以执行任何操作,包括打印错误的值甚至崩溃。但是,您看到的行为最可能的原因是您的系统在较低地址存储较高字节的整数。这是两个常见选项之一:第二个选项是在较高地址存储较高字节。这两个选项称为 endianness 。 More information on it is here.
答案 1 :(得分:3)
您所做的是未定义的行为,因为您违反了严格的别名规则。因此,不要理会从中获得的任何输出。