我有以下结构:
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
函数的堆栈上分配的?如果是这样,你如何建议我修复它,以便它使用mallocated内存?
答案 0 :(得分:3)
在createNode()
中,您清楚地存储了局部变量的地址(&node
):
node->root = root?&root:&node;
那不会飞;只要该功能退出存储的地址无效且无法访问。