2016-12-04 2 views
0

Es ist ein zufälliger Baum Generator und ich muss die Werte des Baumes auf Kind-Traversals verketten. Zum Beispiel, wenn ichBaum Traversal und Verkettung Abstürze in C

com ----- org------net--- 
      | 
      mom---dad---son 
         | 
         good 

Ich möchte die Zeichenfolge „goodsonorg“

struct trie_node *going = root; // this gets the root of the tree 
char* joiner = NULL;    //using this to join the previous part 

char *lastOne = (char *)(malloc(going->strlen+1000)); //setting safe buffer 

while(going->next != NULL || going->children != NULL) { 

    while(going->next){   // always go as right as possible 
     going = going->next; 
    } 

    if(going->children){  //traverse down to child 

     if(joiner == NULL) { // traverse from root (previous will be null) 

      printf(" first key is: \n"); 
      joiner = (char *)(malloc(going->strlen)+100); 
      strncpy(joiner,going->key, going->strlen+1);  
      puts(joiner); 
     } 

     else{ 
      printf(" \n We need to concatenate: \n"); 
      going = going->children; // go down 

      strncpy(lastOne, going->key, going->strlen); // get the current key in last 
      puts(lastOne); 
      printf(" with the previous one to get: \n "); 
      strcat(lastOne, joiner); // attach the joiner to it. 

      strncpy(joiner, lastOne, strlen(joiner)+strlen(lastOne)); // then update the joiner 
      puts(lastOne); 
      } 

Bis zum Ende dieses Blocks des Codes haben sollte ich meine verketteten Zeichenfolge in La Stone haben, jedoch bekomme ich einen segfault für irgendein Grund. Ich bin mir nicht sicher warum. Ich sortiere sicher große Bugger, weil Realloc mir Fehler gab. Ist etwas offensichtlich, dass ich hier vermisse? Die Baumdurchquerung funktioniert definitiv.

+0

Sie sollten in [richtige C-Formatierung] (// prohackr112.tk/r/proper-c-formatting) schauen. Oder lerne, wie du deinen Code gründlich verschleiern kannst (// prohackr112.tk/r/proper-c-obfuscation). –

+0

Ich denke, das Format wurde in Copy Pasting durcheinander gebracht – qaispak

+1

In jedem Fall; Die richtige Formatierung zieht Leute an und ermutigt sie, Ihnen zu helfen. –

Antwort

2

Es gibt ein Problem mit malloc(going->strlen)+100. Sie erhalten eine Adresse aus dem Heap mit malloc() und fügen dann aus irgendeinem Grund 100 zu dieser Adresse hinzu und leiten es explizit um, damit es funktioniert. (Ich schlage vor, Do I cast the result of malloc? zu betrachten.) Solche Zeigerarithmetik macht keinen Sinn. Dies wird sicherlich dazu führen, dass Sie später an der falschen Stelle lesen oder schreiben, was zu einem Segmentfehler führt.

Anstatt zu erraten, was eine geeignete String-Zuweisungsgröße sein sollte, verfolgen Sie, wie groß sie ist, und erweitern Sie sie nach Bedarf (siehe realloc()).