将新节点分配给树节点时程序崩溃

时间:2016-05-14 09:17:34

标签: c pointers memory-management dereference

我为树编写了一个c程序。

#include<stdio.h>
#include<stdlib.h>

struct node{
    int data;
    struct node *left;
    struct node *right;
 };

 struct node* newNode(int value){
    struct node* temp;
    temp->left = NULL;
    temp->right = NULL;
    temp->data = value;

    return temp;
 }

 int main(){
    struct node *root;
    root = newNode(60);
    root->left = newNode(40);
    root->right = newNode(80);
    root->left->left = newNode(30); // program crashes here. 
    root->left->right = newNode(50);

 }

这是我写的另一个程序的子部分。调试时我发现我在分配newNode(30)时遇到错误。我不明白为什么?

2 个答案:

答案 0 :(得分:6)

newNode()函数中,您正在执行

struct node* temp;
temp->left = NULL;     //invalid memory access
temp->right = NULL;    //invalid memory access
temp->data = value;    //invalid memory access

但是,temp没有分配任何有效的内存。当您取消引用无效指针时,它会调用undefined behavior

在取消引用temp之前,您需要将内存分配给temp。您可以使用malloc()和系列来完成此操作,例如,

struct node* temp = malloc (sizeof *temp);
if (temp )
{
    temp->left = NULL;
    temp->right = NULL;
    temp->data = value;
}

应该完成工作。

答案 1 :(得分:3)

您需要为新节点分配内存。像

struct node* temp;
temp = malloc(sizeof(struct node));

当你完成后,你必须再次记住free记忆。