2016-03-31 8 views
-2

トライを理解するために、私はトライの子として0から9までのユーザー10 numを取るこの非常にシンプルなCプログラムを作成しています。最後のステップは、機能printでこれNUMSを印刷することですが、私はセグメンテーションフォールトを取得しています:シンプルCトライプログラムが間違っている(セグメンテーションフォールト)

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

typedef struct list 
{ 
    int data; 
    struct list *ar[10]; 
} list; 

void insert(list *head); 
void print(list *head); 

int main(void) 
{ 
    printf("hello\n"); 
    list *root = malloc(sizeof(list)); 

    insert(root); 
    print(root);  
} 

void insert(list *head) 
{ 
    int a, i; 

    if (head == NULL) { 
     return; 
    } 

    for (i = 0; i < 10; i++) { 
     printf("Give Num 0-9\n"); 
     scanf("%i", &a); 
     head->ar[a] = malloc(sizeof(head)); 
     head = head->ar[a]; 
     head->data = a; 
    } 
} 

void print(list *head) 
{ 
    if (head == NULL) { 
     return; 
    } 

    while (head != NULL) { 
     for (int i = 1; i < 10; i++) { 
      if (head->ar[i] != NULL) { 
       printf("%i", i); 
       head = head->ar[i]; 
       break; 
      } 
     } 
    } 
    printf("\n"); 
} 
+0

'scanf 'からの戻り値、または' a'が0-9の間にあるかどうかは実際には決して決して決してありません。 –

+0

オブジェクトは割り当てられています'malloc()'は初期化されていません。あなたは 'root-> arr [a]'のために有効な値を書くだけですが、配列内のすべてのポインタを読み込みます(そしてそれらがnullでない場合は逆参照してください)。 – EOF

+0

私はこれを簡単にするためにこのようにしています。正しい値のためにsegmeフォルトが発生しています – Spyreto

答えて

0

あなたのコードを持ついくつかの問題があります。

  1. mallocの最初の言及は」doesnの実際にはメモリを初期化します(arフィールド)。正しく初期化する必要があります。

    list *root = malloc(sizeof(list)); 
    

    root->data = 0; 
    for (size_t ii = 0; ii < 10; ii++) { 
        root->ar[ii] = NULL; 
    } 
    
  2. あなたが実際に入力を収集している、あなたはありません、実際のリスト自体のために、ポインタのためだけの十分なメモリを割り当てます。

    head->ar[a] = malloc(sizeof(head)); 
    

    は実際には、これらすべての問題を修正した後、あなたのプログラムを()の実行時に無限ループがあるようです(head = malloc(sizeof(list)); for (size_t ...

  3. 上記のように初期化されなければならない

EDIT:callocを削除します...

+0

'NULL 'がビットワイズゼロである必要はないので、' calloc() 'はポインタには適していません。コード化不可能なコードを提唱しないでください。 – EOF

+0

おそらく '%d'よりはるかに良いかもしれませんが、この特定のケースではおそらく残酷です。['%i'は大丈夫です。](https://en.wikipedia.org/wiki/Scanf_format_string#Format_string_specifications) '%d'がベース16とベース8の入力に加えて何をするのかを行います。 – Schwern

+1

うわー、私は何年も前に '%i'について聞いたことがないかもしれません。しかたがない –

関連する問題