私は次の構造を持っています:
typedef struct binTree_t {
int key;
enum {lMore, rMore, equal} ratio;
struct binTree_t* parent;
struct binTree_t* left;
struct binTree_t* right;
struct binTree_t** root;
} binTree_t;
これは AVL ツリーを表します。問題は、ルート ダブル ポインターのようです。アイデアは、このように への変更が*(node->root)
同じ を指すすべてのノード全体に伝播するというものnode->root
です。この二重の抽象化により、 が**(node->root)
常に正しいルート ノードを指していることを保証する必要があります。ただし、メモリを割り当てる方法に問題があるようです。
binTree_t* createNode(int key, binTree_t* root) {
binTree_t* node = malloc(sizeof(binTree_t));
node->key = key;
node->ratio = equal;
node->parent =
node->left =
node->right = NULL;
node->root = root?&root:&node;
return node;
}
次のコードはどちらも正しく返され12
ます。
int main(void) {
binTree_t* root = createNode(12, NULL);
printf("%d", root->key); free(root);
return EXIT_SUCCESS;
}
int main(void) {
binTree_t* root = createNode(12, NULL);
printf("%d", (*(root->root))->key); free(root);
return EXIT_SUCCESS;
}
ただし、次のコードは と を返し12
ます0
。
int main(void) {
binTree_t* root = createNode(12, NULL);
printf("Text");
printf("%d", root->key); free(root);
return EXIT_SUCCESS;
}
int main(void) {
binTree_t* root = createNode(12, NULL);
printf("Text");
printf("%d", (*(root->root))->key); free(root);
return EXIT_SUCCESS;
}
関数root->root
のスタックにポインタが割り当てられたように見えますか?createNode
もしそうなら、どのように修復して、不正に割り当てられたメモリを使用することをお勧めしますか?