2016-05-08 1 views
0

私はすでに問題を解決することができましたが、問題が何かを正確に理解することができません。私のコードは、前にいた:ポインタについて何か分かりません

BinaryTree removePrivate(int x, BinaryTree *node) 
{ 
    if ((*node).m_key < x) 
     *(*node).m_right = removePrivate(x, (*node).m_right); 
    else if ((*node).m_key > x) 
     *(*node).m_left = removePrivate(x, (*node).m_left); 
    else 
     node= NULL ; 
    return *node; 
} 

それがうまくコンパイルが、それが呼び出されたときに物事が地獄に行きます。 return *ノードでのアクセス違反。

私はそれを変更しました:追加されている[*] = *、[] = *

BinaryTree [*]removePrivate(int x, BinaryTree *node) 
{ 
    if ((*node).m_key < x) 
     [ ](*node).m_right = removePrivate(x, (*node).m_right); 
    else if ((*node).m_key > x) 
     [ ](*node).m_left = removePrivate(x, (*node).m_left); 
    else 
     node= NULL ; 
    return [ ]node; 
} 

を削除されている今、すべてはうまく動作しますが、私は本当に100%を確認していない

なぜこれが良いですか。

+1

:シンプルな形では

。 –

+1

あなたの古いコードでは、 'NULL'のときに' node'を使ったときと同様にヌルポインタの逆参照は、何も逆参照できないので未定義の動作をします。 –

+2

可能であれば '(* node).m_right'の代わりに' node-> m_right'を使うようにしてください。それはもっと読みやすくなります(なぜ?)(http://stackoverflow.com/questions/4263796/c-pointer-dereference-operator-対)。 この投稿にもあなたのスペルを修正してください。 –

答えて

2

(*node)と記述すると、ポインタnodeが参照解除されます。 *(*node)を使用していた場合は、最初に持っていたとおり、逆参照である(*node)を逆参照しています。したがって、nodeBinaryTreeオブジェクトを指すため、別のポインタではないため、意味のない2回の参照解除が行われます。あなたが正確にどのように異なっている行を指摘する場合があります読者へのサービスとして

*node = dereference node 
*(*node) = dereference *node = dereference node twice 
関連する問題