-2

bstにノードを挿入するための以下のプログラムがあります

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


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

struct node * insert(struct node *,int);

int main( int argc, const char *argv[]){
    struct node *root= malloc(sizeof(struct node ));

    int x;

    if(root==NULL){
        printf("mem error"); 
        return;
    }
    root=NULL;


    while(1){
        fprintf(stdout, "Enter the value of data\n" );
        fscanf(stdin,"%d",&x);
        root=insert(root,x);

    }


}

struct node * insert(struct node * root, int data ){

    if(root==NULL){
       struct node *root= malloc(sizeof(struct node ));
       root->key = data;
       printf("hiii\n");
       root->left = NULL;
       root->right = NULL;
       return root;
    }else{
       if(root->key >= data){
          root->left = insert(root->left,data);
       }else if(root->key <= data){
          root->right = insert(root->right,data);
       }
       return root;
    }
}

それは正常に動作します..しかし、挿入関数のmalloc行にコメントすると..最初の値を取得した後にセグメンテーション違反が発生します。ここで何が起こっているのですか??

4

5 に答える 5

1

mallocメモリを取得し、そのアドレスを返します。そのアドレスを変数に格納しない場合、変数には NULL (0) が含まれます。(ポインタを使用して)そのアドレスに保存すると、それは正当なメモリ位置ではなく、プロセッサはそのエラーを訴えます。

于 2013-07-26T16:21:28.880 に答える
0

root が NULL の場合、root->key をアドレス指定すると、メモリの非常に問題のある部分に置かれます。あなたのプログラムは、クラッシュする前に 1 回の反復を生き延びました。

于 2013-07-26T16:29:25.400 に答える