web-dev-qa-db-ja.com

voidポインターを1バイト増やしますか?二人で?

ptrというvoidポインターがあります。この値をバイト数だけ増やしたい。これを行う方法はありますか?

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

ptr = (void *)(++((char *) ptr));のようなことはできますか?

33
Adam S

ポインター演算は、ポイント先オブジェクトのサイズの観点から定義されているため、voidポインターに対して演算を実行することはできません。

ただし、ポインターをchar*にキャストし、そのポインターで算術演算を実行してから、それをvoid*に戻すことができます。

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

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

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

voidポインターでは算術演算を実行できません。

コンパイラは、voidポインターが指しているアイテムのサイズを知りません。ポインターを(char *)にキャストして、そうすることができます。

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

18
Alok Save

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

これにより、バイト単位で増加していることが明らかになります。

6
tdammers

できるよ:

++(*((char **)(&ptr)));
0
EyalSh