将新节点分配给树节点时程序崩溃
program crashing while assigning a new node to tree node
我已经为树写了一个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)
时遇到错误。我不明白为什么?
在你的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;
}
应该完成工作。
您需要为新节点分配内存。喜欢
struct node* temp;
temp = malloc(sizeof(struct node));
当你完成后,你必须记得再次 free
记忆。
我已经为树写了一个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)
时遇到错误。我不明白为什么?
在你的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;
}
应该完成工作。
您需要为新节点分配内存。喜欢
struct node* temp;
temp = malloc(sizeof(struct node));
当你完成后,你必须记得再次 free
记忆。