2011-06-23 17 views
24

私はptrと呼ばれる無効なポインタを持っています。この値をバイト数で増分したい。これを行う方法はありますか?voidポインターを1バイト増加させますか?二人で?

これ以上変数を作成せずにインプレースで行いたいことに注意してください。

ptr = (void *)(++((char *) ptr));のように入力できますか?

答えて

48

ポインター演算がポインティング対象オブジェクトのサイズに関して定義されているため、無効ポインターに対して算術演算を実行することはできません。

あなたは、しかし、そのポインタに算術演算を行い、char*へのポインタをキャストし、その後void*に戻って、それを変換することができます:

void* p = /* get a pointer somehow */; 

// In C++: 
p = static_cast<char*>(p) + 1; 

// In C: 
p = (char*)p + 1; 
+1

それreinterpret_castすべきではない? – Balk

+4

@Balk: 'static_cast'で十分です。 –

15

ポインタはvoidポインタでは実行できません。

voidポインタが指している項目のサイズがコンパイラによって認識されません。ポインタを(char *)にキャストすると、そうすることができます。

gccには、voidのサイズを1として扱う拡張機能があります。 void*の場合、オフセットをバイト単位で追加することができますが、これを使用すると移植性のないコードが生成されます。

+0

をGCCでは、 'は、はsizeof(無効)'利回り '1'ので、それが可能です。 –

+0

@Blagovest Buyukliev:これはGCCの拡張であり、voidのサイズを1として扱い、それを使用すると移植性のないコードが生成されます。 –

+1

@Blag:いつものように、 '-pedantic'でコンパイルしてください。 :) – Xeo

4

だけ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); 

これは、バイト数が増えていることを示しています。

+1

いつも '-pedantic'でコンパイルしてください。 :) GCCの非準拠の拡張です。 – Xeo

+0

私は甘やかされていると思う:) - 正しい答えを編集しました – tdammers

-1

あなたは行うことができます。

++(*((char **)(&ptr))); 
+4

ええ、でも、なぜあなたは?これはひどいあいまいなコードなので、何の理由があるのか​​を解析することは不必要に難しくなります。また、CスタイルのキャストはC++では推奨されませんが、これはここでの問題の中では最小です。 –

+2

また、あなたの目の中に燃える棒を押し込むこともできます。おそらく '++(*((char **)(&ptr)));)'を見ているよりも少なくなるでしょう。 –

関連する問題