2016-11-21 10 views
0

私はバイナリ検索ツリーを使って電話帳プログラムを作っています。新しいデータを入力しようとすると、セグメンテーションフォルトが発生します。まず、私は名前がphoneData.セグメンテーション違反の取得。理由が分からない

typedef struct phoneData { 
    char name[NAME_LEN]; 
    char phoneNum[PHONE_LEN]; 
    struct phoneData *right, *left; 
} phoneData; 

void InputPhoneData() 
{ //phoneData *pData; 
    char name[NAME_LEN]; 
    char phoneNum[PHONE_LEN]; 

    /*if ((pData = (phoneData*)malloc(sizeof(phoneData))) == NULL) { 
     fprintf(stderr, "Memory Allocation failed\n"); 
     return; 
     }*/ 

    fputs("이름 입력: ", stdout); 
    if (fgetString(name, NAME_LEN, stdin) == 1) { 
     getchar(); 
     return; 
    } 

    fputs("전화번호 입력: ", stdout); 
    if (fgetString(phoneNum, PHONE_LEN, stdin) == 1) { 
     getchar(); 
     return; 
    } 

    insert_node(name, phoneNum); 
    numOfData++; 

    fputs("입력이 완료되었습니다.", stdout); 
    getchar(); 
} 

であり、これは私が入力したデータを呼び出す機能である型定義構造を有しています。韓国の文章は気にしないでください。この関数では、私は別の関数を呼び出しますinsert_node。バイナリサーチツリーノードを挿入する関数です。

void insert_node(char name[], char phoneNum[]) 
{ 
    phoneData *p, *t; 
    phoneData *n; 

    t = *root; 
    p = NULL; 

    while (t != NULL) { 
     if (strcmp(name, t->name) == 0) 
      return; 

     p = t; 
     if (strcmp(name, p->name) < 0) 
      t = p->left; 
     else 
      t = p->right; 
    } 

    n = (phoneData*)malloc(sizeof(phoneData)); 
    if (n == NULL) 
     return; 

    strcpy(n->name, name); 
    strcpy(n->phoneNum, phoneNum); 
    n->left = n->right = NULL; 

    if (p != NULL) { 
     if (strcmp(p->name, name) < 0) 
      p->left = n; 
     else 
      p->right = n; 
    } 
    else 
     *root = n; 
} 

私はまだセグメント化エラーが発生しているのですか?私は既にfgetStringの機能をチェックしていて、それは大丈夫だと思われます。 InputPhoneData機能またはinsert_node機能に間違いをしましたか?

+1

あなたはvalgrindのを試してみましたか?どのラインが問題であるかを示すかもしれません。 –

+1

't = * root;';を設定します。 'root'はどこで初期化されていますか? (そして、そのことに関して定義されています) – doctorlove

+0

ところで、変数 'root'はNULLとして初期化されたダブルポインタであるグローバル変数です。 (phoneData ** root = NULL;) –

答えて

3

ところで、変数 'root'はNULLで初期化されたダブルポインタであるグローバル変数です。 (phoneData ** root = NULL;)

これはあなたの問題です。 *rootはNULLポインタを逆参照します。

変更に宣言:

phoneData *root = NULL; 

し、コードの残りの部分で&rootrootroot*rootを交換してください。

+0

それは働いた!手伝ってくれてどうもありがとう! –

関連する問題