主函数有2个代码。我正在学习数组和指针。我更感兴趣的是,当两个部分放在一起时,为什么代码会抛出分段错误。当它们单独运行时,它们运行良好
#include <stdlib.h>
#include <stdio.h>
typedef struct nodeT{
int data;
struct nodeT *left;
struct nodeT *right;
}node;
insert(node **root, int data){
if(*root == NULL){
node *elem;
elem = (node*)malloc(sizeof(node));
elem->data = data;
elem->left = NULL;
elem->right = NULL;
*root = elem;
}
else{
if((*root)->data > data){
insert(&((*root)->left),data);
}
else{
insert(&((*root)->right),data);
}
}
}
inorder(node *root){
if(root == NULL){
return;
}
else{
inorder(root->left);
printf("%d n", root->data);
inorder(root->right);
}
}
update(int A[]){
A[3] = 1000;
}
main(){
//PART 1
node *root;
insert(&root,5);
insert(&root,6);
insert(&root,8);
insert(&root,1);
insert(&root,9);
inorder(root);
// PART 2
int A[10];
int i = 0;
for(i = 0 ; i < 10 ; i++){
A[i] = i;
}
for(i = 0 ; i < 10 ; i++){
printf("%d n", A[i]);
}
printf("n");
update(A);
for(i = 0 ; i < 10 ; i++){
printf("%d n", A[i]);
}
printf("n");
}
因为根是未初始化的,所以它应该是空的(可能)。所以你得到了不确定的行为。
main 也应该返回一个值(只是因为 c 允许你省略 'int' 才能编译)。您的代码将告诉客户端它已退出并出现不可预测的错误。
我认为你这里有一个问题
insert(node **root, int data){
if(*root == NULL){
在insert
函数中。这与以下内容相结合
node *root;
insert(&root,5);
是一个问题,因为您没有在main()
内显式将root
设置为 NULL,因此理论上它的地址可以是任意值。
只要root
不为空,您就会访问您无权访问的值,例如此处
(*root)->data > data
这可能会在main()
开始时未明确设置为 NULL 的root
段错误。
至于说代码的每个部分在单独运行时都运行"正常",那么我会说这一定只是运气好,因为代码的第 1 部分有一个明显的问题。