1

私は示されているような構造を持っています。また、構造体へのポインターがある場合、そのメンバーのいずれかを正常に初期化または変更できます。

struct node{
    int key;
    int nno;
    char color;
    struct node* out;
    struct node* next;
    struct node* pre;
};

しかし、構造体ポインターのアドレスを関数に渡し、ダブルポインターを使用して同じアドレスをキャプチャし、そのダブルポインターを使用してメンバーにアクセスしようとすると、コンパイラーが「メンバー未定義」というエラーをスローします。

void DFSVisit(struct node** u){
    *u->color = 'g';
    struct node* v;
    while(*u->out != NULL){
            v = *u->out;
                    if(v->color == 'w'){
                            v->pre = *u;
                            DFSVisit(&v);
                    }
    } 
    *u->color = 'b';
}

そして、これが私が関数にアクセスした方法です。

DFSVisit(&root);

ルートは、適切に初期化されたポインターです。また、Root はグローバル変数です。

4

2 に答える 2

6

間接参照 (逆参照) 演算子 は*、要素選択演算子 よりも優先順位が低いことをご存知->ですか? (*u)->colorつまり、 ではなくと書くべきです*u->color

于 2013-01-12T10:06:01.490 に答える
6

*u->colora にはメンバーがないため (構造体ではなくポインターであるため) 、コンパイラーは文句を言い*(u->color)ます。したがって、括弧を明示的に挿入するか、ローカル変数を導入します。(*u)->colornode*color(*u)->colorstruct node *node = *u;node->color

于 2013-01-12T10:05:38.750 に答える