2

申し訳ありませんが、非常に単純な質問に違いありませんが、さまざまな方法で試してみましたが成功しなかったため、ここで確認する必要があります。C プログラミング :

構造体名がありrtgます。編集: mtch の型は LLIST です 初期の型は LL_NODE です obj の typr はポインター (void) です

. チェック時にgdbを使用する

(gdb)  print *rtg->mtch->initial->obj
Attempt to dereference a generic pointer.


(gdb) print rtg->mtch->initial->obj

$10 = (void *) 0x4cc660
(gdb) x 0x4cc660
0x4cc660:       0x00000000

このヌル ポインターは、私のプログラムで segfault を引き起こします。私が探しているのは、rtg->mch->initial->obj が指している値がゼロでないことを確認する方法です。(上記のセグメンテーション違反を防ぐために)つまり if (rtg->mtch->initial->obj)、 でチェックすると、ポインタ obj 、アドレスがゼロではないかどうかがチェックされます(これは私が意図したものではありません。そのポインタの値がゼロではないことをチェックするつもりです(ただし、 * gdb をチェックインする前に、「ジェネリック ポインターを逆参照しようとしています」と表示されます。では、その値がゼロでないことを確認する (そしてこの segfault を防ぐ) 正しい方法は何ですか?

編集:私はこれを試しました

if (*((char *) rtg->mtch->initial->obj) != NULL)

しかし、私はコンパイル警告を受けました:

警告: ポインタと整数の比較

EDIT2 、ここでこれらはソースコードで定義されています

ECM_REQUEST は struct ECM_REQUEST rtg; です。この構造体では、mtch を LLIST mtch として定義します。

初期はLL_NODE

obj はポインタです obj の値がゼロでないことを確認したい

これで、私の質問についてすべてが明確になりましたね。

ありがとう

4

2 に答える 2

1

ジェネリック ポインターを逆参照することはできません。私が考えることができる唯一の解決策は、値をチェックするために整数への一時的なポインターを作成することです。基本的

int *tmp = rtg->mtch->initial->obj;
if (*tmp != 0)
/* the rest of your code here */

キャストも機能する可能性がありますが、私の意見では、一時ポインターを使用するとコードが読みやすくなります。

于 2013-03-06T16:31:01.800 に答える
0

警告は、左側が参照解除char *されたもの (つまり、 a char) であり、右側が null ポインター定数 ( a void *;の形式) であるためです。あなたはchar値を値に変換していvoid *ます...おそらくあなたは意味しましたchar **か?

void *o = rtg == NULL                ? NULL
        : rtg->mtch == NULL          ? NULL
        : rtg->mtch->initial == NULL ? NULL
        : rtg->mtch->initial->obj;

if (o != NULL) { /* ... */ }

... o の型を他のオブジェクトポインタに変更しても安全であることに注意してください (たとえば、あなたの質問は示唆しているようchar **です?)

于 2013-03-06T16:55:50.127 に答える