sizeof(int*)
并且sizeof(short*)
两者都将是相同的——正如将sizeof(void*)
——你要求的是指针的大小,而不是指针指向的东西的大小。
使用sizeof(int)
或sizeof(short)
代替。
现在,对于您的代码片段,您正在对正在运行的机器的字节序进行假设。给定平台上的“第一”部分int
可能是地址较高的字节,也可能是地址较低的字节。
例如,您的内存块可能是这样布置的。假设最低有效字节的索引为零,而最高有效字节的索引为一。在大端架构上,int 可能如下所示:
<------------- 4 bytes --------------->
+---------+---------+---------+---------+
| int:3 | int:2 | int:1 | int:0 |
| short:1 | short:0 | short:1 | short:0 |
+---------+---------+---------+---------+
请注意 int 中的第一个 short (在您的情况下应该是((short*) arr)[6]
)如何包含 int 的最高有效位,而不是最低有效位。因此,如果您覆盖((short*) arr)[6]
,您将覆盖 的最高有效位arr[3]
,这似乎是您想要的。但是 x64 不是大端机器。
在小端架构上,您会看到:
<------------- 4 bytes --------------->
+---------+---------+---------+---------+
| int:0 | int:1 | int:2 | int:3 |
| short:0 | short:1 | short:0 | short:1 |
+---------+---------+---------+---------+
导致相反的行为 -((short*) arr)[6]
将是 的最低有效位arr[3]
,并且((short*) arr)[7]
将是最重要的。
这是我的机器发生的事情——你的机器可能不同:
C:\Users\Billy\Desktop>type example.cpp
#include <iostream>
int main()
{
std::cout << "Size of int is " << sizeof(int) << " and size of short is "
<< sizeof(short) << std::endl;
int arr[5];
arr[3] = 50;
((short*) arr)[6] = 2;
std::cout << arr[3] << std::endl;
((short*) arr)[7] = 2;
std::cout << arr[3] << std::endl;
}
C:\Users\Billy\Desktop>cl /W4 /EHsc /nologo example.cpp && example.exe
example.cpp
Size of int is 4 and size of short is 2
2
131074