两个不相关的c代码放在一起时的分段错误

时间:2014-01-09 14:06:25

标签: c segmentation-fault

主要功能有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");
}

2 个答案:

答案 0 :(得分:0)

因为root是未初始化的,所以它应该为null(可能)。所以你得到了不确定的行为。

main也应该返回一个值(只是因为c允许你省略'int'来编译)。您的代码将告诉客户端退出时出现无法预料的错误。

答案 1 :(得分:0)

我认为你有问题

insert(node **root, int data){

    if(*root == NULL){

insert功能中。这结合以下

node *root;
insert(&root,5);

是一个问题,因为您没有在root内明确地将main()设置为NULL,因此理论上它的地址可以是任意值。

每当root不为NULL时,您正在访问您没有业务访问权限的值,例如此处

(*root)->data > data

这可能会在root开始时main()未明确设置为NULL的段错误。

至于说代码的每个部分在单独运行时运行“正常”,那么我会说这一定是好运,因为代码的第1部分有明显的问题。