私はgccでvoid *とchar *はポインタの算術演算に関して同じように扱われると考えました。つまり、void *は "メモリ内の1バイトに"指しているので、次のコードC voidポインタの算術
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
実際には0x984a008 0x984a009
が返されます。ポインタと同様に、ボイド**点、そうずつ増分は実際に、すなわち、4バイト(32ビットOS上で)によって
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
戻り0x984a008 0x984a00c
の増加を意味します。それが再び0x984a008 0x984a009
返すのでしかし、次のコードは、私に
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
を混乱させる。ここで何が起こっているのですか?
おそらく、あなたは 'void型を意図** P、** P1を、代わりに' 'void ** p、* p1;'? –
'sizeof(void)'は1であるか、少なくとも警告を出しますが、無駄です。あなたはそれをしません。 'void '型は何を表しますか? 'void * 'しかありません。 –
私はvoid ** p、* p1を意味しました。私はこのコードがコンパイルされていることを知っていますが、pが当初はvoid **として宣言されていて、p + 1が4バイト分のインクリメントに対応し、p1がvoid *算術演算はp1 + 1に対して1バイトしか追加しません。 – Ivan