私はptr
と呼ばれる無効なポインタを持っています。この値をバイト数で増分したい。これを行う方法はありますか?voidポインターを1バイト増加させますか?二人で?
これ以上変数を作成せずにインプレースで行いたいことに注意してください。
ptr = (void *)(++((char *) ptr));
のように入力できますか?
私はptr
と呼ばれる無効なポインタを持っています。この値をバイト数で増分したい。これを行う方法はありますか?voidポインターを1バイト増加させますか?二人で?
これ以上変数を作成せずにインプレースで行いたいことに注意してください。
ptr = (void *)(++((char *) ptr));
のように入力できますか?
ポインター演算がポインティング対象オブジェクトのサイズに関して定義されているため、無効ポインターに対して算術演算を実行することはできません。
あなたは、しかし、そのポインタに算術演算を行い、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*
の場合、オフセットをバイト単位で追加することができますが、これを使用すると移植性のないコードが生成されます。
をGCCでは、 'は、はsizeof(無効)'利回り '1'ので、それが可能です。 –
@Blagovest Buyukliev:これはGCCの拡張であり、voidのサイズを1として扱い、それを使用すると移植性のないコードが生成されます。 –
@Blag:いつものように、 '-pedantic'でコンパイルしてください。 :) – Xeo
だけvoid*
をインクリメントすると、GCCで働くことが起こるん:
char*
にキャストして:あなたはそれを明示的にしたいので
#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;
}
それは、しかし、概念的に(正式)間違っているのです。
void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
これは、バイト数が増えていることを示しています。
あなたは行うことができます。
++(*((char **)(&ptr)));
ええ、でも、なぜあなたは?これはひどいあいまいなコードなので、何の理由があるのかを解析することは不必要に難しくなります。また、CスタイルのキャストはC++では推奨されませんが、これはここでの問題の中では最小です。 –
また、あなたの目の中に燃える棒を押し込むこともできます。おそらく '++(*((char **)(&ptr)));)'を見ているよりも少なくなるでしょう。 –
それreinterpret_castすべきではない? – Balk
@Balk: 'static_cast'で十分です。 –