構造体があり、オフセットをメンバーに抽出するとします。
struct A {
int x;
};
size_t xoff = offsetof(A, x);
struct A
標準に準拠した方法でメンバーを抽出するためのポインターが与えられた場合、どうすればよいですか? もちろん、正しいオフセットと正しいオフセットがあると仮定しstruct A*
ます。1 つの試みは、次のようなことです。
int getint(struct A* base, size_t off) {
return *(int*)((char*)base + off);
}
これはおそらく機能しますが、たとえば、ポインターが同じ配列のポインター (または末尾を過ぎたポインター) である場合にのみ、ポインター演算が標準で定義されているように見えることに注意してください。これは事実である必要はありません。技術的には、その構造は未定義の動作に依存しているように見えます。
別のアプローチは
int getint(struct A* base, size_t off) {
return *(int*)((uintptr_t)base + off);
}
これもおそらく機能intptr_t
しますが、存在する必要はなく、私が知る限り、算術演算でintptr_t
正しい結果が得られる必要はないことに注意してください(たとえば、一部のCPUには、バイト境界で整列されていないアドレスを処理する機能があることを思い出します。配列内のintptr_t
それぞれについて 8 ずつ増加することを示唆しています)。char
標準で忘れられているもの (または私が見逃したもの) があるようです。