2016-03-31 24 views
-2

Denemeyi anlamak için, kullanıcı 10 karakterinden 0'dan 9'a kadar olan bu çok basit C programını oluşturuyorum. Son adım fonksiyonu print ile bu nums yazdırmak, ama bir segment hataya alıyorum:Simple C trie programı yanlış gidiyor (segmentasyon hatası)

#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

Aslında hiçbir zaman "scanf" dönüş değerini kontrol etmiyorsunuz ya da "a" değerinin 0-9 arasında kalıyor mu? –

+0

Atanan nesne malloc() 'tarafından başlatılmamış. Sadece root-> arr [a] 'için geçerli bir değer yazarsınız, ancak dizideki tüm göstergeleri okumayı (ve null olmadığında dereferansı) deneyin. – EOF

+0

Bu şekilde basitlik için yapıyorum, doğru değerler için segme hatası alıyorum – Spyreto

cevap

0

sizin koduyla çeşitli sorunlar vardır:

  1. doesn malloc ilk söz' t Belleği gerçekten başlatır (ar alanı). Bu tabloyu düzgün bir şekilde başlatmanız gerekir, örn.

    root->data = 0; 
    for (size_t ii = 0; ii < 10; ii++) { 
        root->ar[ii] = NULL; 
    } 
    
  2. aslında girişini toplanıyor, değil asıl listedeki kendisi, pointer için sadece yeterli bellek ayrılamadı.

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

    yukarıdaki gibi başlatıldı edilmelidir (head = malloc(sizeof(list)); for (size_t ...

  3. aslında tüm bu konuları) düzeltildikten sonra (programınızı çalıştırırken sonsuz döngü gibi görünüyor

DÜZENLEME:. calloc kaldır ...

+0

'calloc()' işaretçiler için uygun değildir, çünkü NULL öğesinin bitwise-zero olması gerekmez. Ulaşılamaz kodu savunmayın. – EOF

+0

['% i' gayet iyi] (https://en.wikipedia.org/wiki/Scanf_format_string#Format_string_specifications), '% d''den daha iyi, ancak bu özel durumda muhtemelen aşırıya kaçıyor. Temel% ve taban 8 girdisi ile% d' artı anlaşma yapar. – Schwern

+1

Vay canına, yıllar önce hiç duymadım '% i'. Oh iyi –