2017-11-23 15 views
0

バイナリサーチツリーで作業しています。割り当てられたメモリーを失うことなく初期化に関する質問があります。初期化ポインターへのポインターへのポインターへのポインターへのポインターのポインタ

/* newStructure.h */ 
typedef struct Item { 
    int key; 
    struct Item* LPtr; 
    struct Item* RPtr; 
} *tItem; 

メインコード:

#include <stdio.h> 
#include "newStructure.h" 

int main() { 
    tItem* rootNode; 
    if ((rootNode = malloc(sizeof(struct Item))) == NULL) 
     // Problem with malloc 
     return 1; 

    else { 
     //Initialize node 
     *rootNode = NULL; /* And here points my question */ 
    } 
    // Code continues.. 
} 

私はmalloc()を使用する場合、struct Itemのサイズのメモリブロックが割り当てられた、そのアドレスが*rootNodeに格納されていた、私は右ですか?
しかし、このノードをNULL(ノードにはまだデータが入っていません)に初期化すると、*rootNodeにはNULLが含まれているため、割り当てられたメモリブロックのアドレスが失われてしまいます。
ここに何か不足していますか?

+0

直接関係のない、決してポインタ型を非表示にするのtypedefを使用しています。あなたのコードをもっと明瞭にするのではなく、混乱を招くだけです。 –

+2

ここでポインタへのポインタが必要な理由は不明です。 typedefを使わずにコードを書き直すと、より明確になるはずです。 –

答えて

1

しかし、私はNULLにこのノードを初期化する[...]

これは、あなたがsizeof(struct Item)のブロックを割り当てたNULL

*rootNode = NULL; 

にノードを初期化する正しい方法ではありませんポインターへのポインターであるはずのフィールドに渡しますが、それをポインターとして扱いますが、これは間違っています。

あなたのコードは、ポインタへのポインタを必要としない、単一の間接ポインタは十分であろう:

tItem rootNode; // You typedef-ed tItem is a pointer 
if ((rootNode = malloc(sizeof(struct Item))) == NULL) { 
    // Problem with malloc 
    return 1; 
} else { 
    //Initialize node 
    rootNode->key = 0; 
    rootNode->LPtr = NULL; 
    rootNode->RPtr = NULL; 
} 
+0

しかし、ここでは 'roodNode-> key = 0;'、あなたはノードを空として初期化しませんでしたが、キー値が0に等しいノードとして初期化されましたか、それとも本当にそれを取得しませんか... – SevO

+0

@ SevOの 'rootNode'は、' NULL'に設定されている限り、空です。一度メモリを割り当てると、もう空ではなくなります。 – dasblinkenlight

+0

私のポインタがどこかを指していないことを確認するために、割り当ての前に私の "初期化"を使うことができます。 – SevO

関連する問題