将类型为struct的类型的struct成员初始化为null

时间:2018-11-25 10:17:45

标签: c

在将空值分配给指向结构成员的指针(这也是指向结构的指针)时遇到问题。以下代码正确地将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语句如何发挥作用。在我的代码的任何其他地方,没有其他地方可以分配或更改此变量的值。

2 个答案:

答案 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;

在这里,您将丢弃不必要分配的内存地址。

我认为您需要进一步阅读内存管理,然后我们才能为您解决此问题。