在将空值分配给指向结构成员的指针(这也是指向结构的指针)时遇到问题。以下代码正确地将headNode->right
变量设置为等于null,但没有将headNode->left
变量设置为等于。
typedef struct node {
char *key;
int frequency;
struct node *left;
struct node *right;
struct node *parent;
} node;
void addKey(char key[]) {
extern node *headNode;
node *newNode;
if (headNode != NULL) {
printf("Head node is initialized\n");
if (headNode->left != NULL) printf(" Left is not null\n");
if (headNode->right != NULL) printf(" Right is not null\n");
}
newNode = malloc(sizeof(node*));
newNode->key = malloc(sizeof(char) * (strlen(key) + 1));
newNode->left = malloc(sizeof(node*));
newNode->right = malloc(sizeof(node*));
newNode->parent = malloc(sizeof(node*));
newNode->left = newNode->right = NULL;
newNode->frequency = 1;
newNode->right = NULL;
strcpy(newNode->key, key);
// If this is the first node, assign it as the root
if (headNode == NULL) {
newNode->parent = NULL;
headNode = newNode;
return;
}
}
但是,如果我在return
语句之前添加以下两行,则它可以正常工作。
if (headNode->left == NULL) printf("L is null\n");
else printf("L is NOT null\n");
我不明白if语句如何发挥作用。在我的代码的任何其他地方,没有其他地方可以分配或更改此变量的值。
答案 0 :(得分:4)
所有malloc(sizeof(node*))
应该是malloc(sizeof(node))
。您只是为指针分配了足够的空间,而不是整个结构。以下所有通过这些指针间接访问的代码都会导致未定义的行为。
答案 1 :(得分:3)
退后一步。这里有很多严重的错误。
您声明一个指向node
的指针:
node *newNode;
到目前为止,太好了。但是,当您尝试为该新节点分配内存时,您只能分配足够的空间来存储指针,而不是节点本身:
newNode = malloc(sizeof(node*));
您已经存储了指针newNode
。
将此行更改为:
newNode = malloc(sizeof(node));
稍后,您又对malloc
进行了三个不必要的调用:
newNode->left = malloc(sizeof(node*));
newNode->right = malloc(sizeof(node*));
newNode->parent = malloc(sizeof(node*));
如果您在上一次调用中请求了足够的内存(即sizeof(node)
),则无需为这些内部字段分配更多的内存。您已经为他们准备了记忆;它已经存在于newNode
所指向的地址。
更糟糕的是,然后继续在下一行中泄漏内存:
newNode->left = newNode->right = NULL;
在这里,您将丢弃不必要分配的内存地址。
我认为您需要进一步阅读内存管理,然后我们才能为您解决此问题。