ptr
というvoidポインターがあります。この値をバイト数だけ増やしたい。これを行う方法はありますか?
これ以上変数を作成せずにインプレースで実行したいことに注意してください。
ptr = (void *)(++((char *) ptr));
のようなことはできますか?
ポインター演算は、ポイント先オブジェクトのサイズの観点から定義されているため、voidポインターに対して演算を実行することはできません。
ただし、ポインターをchar*
にキャストし、そのポインターで算術演算を実行してから、それをvoid*
に戻すことができます。
void* p = /* get a pointer somehow */;
// In C++:
p = static_cast<char*>(p) + 1;
// In C:
p = (char*)p + 1;
void
ポインターでは算術演算を実行できません。
コンパイラは、void
ポインターが指しているアイテムのサイズを知りません。ポインターを(char *
)にキャストして、そうすることができます。
Gccには、void
のサイズを1
として扱う拡張機能があります。したがって、void*
で算術演算を使用してバイト単位でオフセットを追加できますが、これを使用すると移植性のないコードが生成されます。
void*
をインクリメントするだけで、gccで機能します:
#include <stdlib.h>
#include <stdio.h>
int main() {
int i[] = { 23, 42 };
void* a = &i;
void* b = a + 4;
printf("%i\n", *((int*)b));
return 0;
}
しかし、概念的に(そして公式に)間違っているので、明示的にしたいと思います:char*
にキャストしてから戻します。
void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
これにより、バイト単位で増加していることが明らかになります。
できるよ:
++(*((char **)(&ptr)));