sizeof(int*)両方ともsizeof(short*)同じになりますsizeof(void*)-そうであるように-ポインターが指すもののサイズではなく、ポインターのサイズを求めています。
代わりにsizeof(int)またはを使用してください。sizeof(short)
さて、コード スニペットに関しては、実行しているマシンのエンディアンについて仮定しています。特定のプラットフォームの の「最初の」部分は、int上位アドレスのバイト、または下位アドレスのバイトである場合があります。
たとえば、メモリ ブロックは次のように配置されている場合があります。最下位バイトのインデックスが 0 で、最上位バイトのインデックスが 1 だとします。ビッグ エンディアン アーキテクチャでは、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