1

次のようなコードがあります。

int num = 5;
int *ptr = #
void **xptr = &ptr;
printf ("values:%d\n",**(int *)xptr); 

int ポインターを指す void double ポインターを逆参照できないのはなぜですか? 以下の 2 つの例は動作します。

スニペット:1

int *ptr = #
int **xptr = &ptr;
printf ("values:%d\n",**xptr);

スニペット 2:

void *ptr = #
printf ("values:%d\n",*(int *)ptr);
4

2 に答える 2

5

void **とは異なり、汎用ポインターではありませんvoid *。操作する値は、どこかvoid **にある実際の値のアドレスでなければなりません。void *コンパイラは次の警告を生成する必要がありますvoid **xptr = &ptr;

[Warning] initialization from incompatible pointer type [enabled by default]

次のように行うことができます

int num = 5;
void *ptr = #
void **xptr = &ptr;
printf ("values:%d\n", *((int *)*xptr));  

より詳細な説明については、comp.lang.c の FAQ リスト · 質問 4.9を参照してください。

于 2014-09-09T15:50:17.943 に答える
3

解決策は、両側に両方のアステリックを使用することです。

printf ("values:%d\n",**(int **)xptr); 

なんで?そうしないと、実際に行っていることについてコンパイラに誤った情報を与えるためです。C スタイルのキャストはすべてをコンパイルするように強制できますが、自分で注意する必要があります。コンパイラに何かを強制する場合は、おそらくクラッシュ コードを生成することをコンパイラのせいにしないでください。

コンパイラがそれについて警告を生成しなかったのではないかと思います。警告を無視しましたか?

の初期化はおそらく間違っていることに注意してくださいxptr。hacks の投稿をご覧ください

于 2014-09-09T15:50:08.480 に答える