私はターゲットのプロセスメモリを変更する必要があるプログラムに取り組んでいます。C - ポインタ算術演算を行うときにuintptr_tとchar *をキャストする理由
これまでのところ、私は住所がを格納するためのvoid *を使用して、私はそれらを変更する必要がある場合、それらはchar *にキャストしています(オフセット追加または一般に変更)
私はstdint.hで定義されているタイプの聞いたことがあるが、私は、char *変換(それは私より多くのC89フレンドリーであると思われる)の上のポインタ算術のためにそれを使用する違いは表示されません
私の質問:これらの両方の方法は、ポインタ演算に使用する必要がありますか?いずれにしてもchar *以上のuintptr_tの使用を検討すべきでしょうか?
EDIT 1
基本的に私はちょうどコードがアドレスを扱っている場合は、次のは正しくない可能性があると指摘。これはコメントユーザーRで
0x00F00BAA hard coded memory adress in target
process
void* x = (void*)0x00F00BAA;
char* y = (void*)0x00F00BAA;
x = (uintptr_t)x + 0x123;
y = (char*)y + 0x123;
x == y?
x == (void*)0x00F00CCD?
y == (void*)0x00F00CCD?
標準では、 'uintptr_t'変数の算術的な変更に続いて' char * 'へのキャストが保証されないと、' char * 'に数学を直接適用するのと同じ結果になります'uintptr_t'は派生したものですが、これが成立しなければ狂っていると思います。 – PSkocik
@PSkocikもちろんそれは成立せず、全く狂っていません。 –
@AnttiHaapala私がuintptr_tを3だけ動かすと、対応するchar *が3で動くことも期待されます。フラットメモリモデルのプラットフォームが何か違うことをしたいのはなぜか分かりません。 – PSkocik