#前提
メモリのオフセットの理解がいまいちできていなかったので、Visual Studioのデバッグを使って色々試してみようと思ったのですが、問題が出ました。
#コード
全体のコードです
超シンプルなものですし、その後部分的に分けて意図を書くので流し読みで大丈夫です。
cpp
1#include <iostream> 2int main() 3{ 4 uintptr_t initialVar = 12345; 5 uintptr_t nextVar = 5530; 6 7 uintptr_t* pInitialVar = &initialVar; 8 uintptr_t* pNextVar = &nextVar; 9 10 std::cout << "initialVar address: " << pInitialVar << std::endl; 11 std::cout << "nextVar address: " << pNextVar << std::endl; 12 13 std::cout << "address distance: " << pInitialVar - pNextVar << std::endl; 14 15 uintptr_t* A = pInitialVar - 0xC; 16 std::cout << "A address: " << A << std::endl; 17 std::cout << "A value: " << *A << std::endl; 18 19 return 0; 20}
#各行の意図と出力の結果
cpp
1uintptr_t initialVar = 12345; 2uintptr_t nextVar = 5530; 3 4uintptr_t* pInitialVar = &initialVar; 5uintptr_t* pNextVar = &nextVar;
まずuintptr_t型の変数と、その変数のポインタを作りました。
cpp
1std::cout << "initialVar address: " << pInitialVar << std::endl; 2std::cout << "nextVar address: " << pNextVar << std::endl;
ここで、二つの変数のアドレス値を出力しました。
もちろん実行するたびにアドレスは変動するのですが、例として一つ実際の出力結果を置いときます↓
initialVar address: 001EFC5C nextVar address: 001EFC50
この二つの変数のアドレスの距離は、見た通り0xCですよね?
cpp
1std::cout << "address distance: " << pInitialVar - pNextVar << std::endl;
にも関わらず、この行の出力結果は3
となります。
cpp
1uintptr_t* A = pInitialVar - 0xC; 2std::cout << "A address: " << A << std::endl; 3std::cout << "A value: " << *A << std::endl;
なので、pInitialVar - 0xCをすると、見当違いなアドレスになってしまいます。
ちなみに0x3にすると、想定通りの動きをします。
これはどういうことなんでしょうか。
Visual Studioのメモリビューで確認したところ、pInitialVarとpNextVarの頭から頭までの距離は0xCバイトでした。
なんで減算の結果が3となるんでしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/18 04:59