Cで定義されている割り切れないポインタアドレスの減算ですか? C++で?割り切れないポインタアドレスの減算
void* p = malloc(64);
int* one = (int*)((char*)p);
int* two = (int*)((char*)p + 7);
printf("%x %x %d %d\n", one, two, sizeof(int), two - one);
は、ここでの例です。
出力が8a94008 8a9400f 4 1
になるので、除算を行い残りを切り捨てるように見えます。行動は定義されていますか?
間違った型のデータを 'printf()'に渡して、*未定義の動作*を呼び出しました。 printf( "%p%p%zu%td \ n"、(void *)one、(void *)two、sizeof(int)、two - one); ' – MikeCAT
私はしていません引用がある。ポインタ演算は整数演算に基づいており、よく定義されています。ですから、私は 'two-one'がよく定義されていると思います。合理的な人のようにポインタが詰め込まれていなくても、期待するでしょう。一方、これをしないでください、誰もあなたのコードベースでこれを見つけることはありません。 – Johannes
あなたのプログラムでポインタ 'two'を保持していても、ポインタが' int'の整列制約を満たさないため無効です(実際にはほとんどのハードウェアでは、実際に試して参照解除するまで – Thomas