2011-05-21 69 views
1
Program received signal SIGSEGV, Segmentation fault. 
0x08048637 in insertWordDictR (string=0xbf87e7b6 "a", child=0x20f88, 
    isTerminal=0x20f8c) at dictionary.c:54 
54      *isTerminal = False; 
在頭文件

我有爲什麼這個段錯誤?

typedef enum {False, True} bool; 

下面是代碼的相關線:

dictLink insertWordDictR(char *string, dictLink child, bool* isTerminal){ 
    dictLink newWord; 

    if(isTerminal != NULL){ 
    if(string[0] == '\0'){ 
      *isTerminal = True; 
      return NULL; 
    }else{ 
      *isTerminal = False; 
    } 
    } 


    if (child == NULL){ 
     newWord = malloc(sizeof (struct dictEdge)); 
     newWord->thisChar = string[0]; 
     newWord->child = insertWordDictR(string + 1, newWord, &(newWord->isTerminal));    
     newWord->sibling = NULL; 
    }else{ 
     newWord = insertIntoSiblingList(string, child);  

    } 

    return newWord; 
} 

此線是我怎樣調用該函數的示例

newWord->child = insertWordDictR(string + 1, newWord, &(newWord->isTerminal)); 

All files can be found here,還有一個名爲「測試」的輸入文件。

+2

在您調用insertWordDictR函數的地方發佈代碼,也包括您傳遞給該函數的所有變量的定義 – nos 2011-05-21 12:38:23

+0

我建議啓用其他編譯器警告......例如,如果您使用gcc,「-Wall」命令行選項可能會警告未初始化的「result」使用。 – 2011-05-21 15:42:22

回答

2

在這個序列中你是從一個未初始化的指針走場的地址,通過插入註釋所示:

dictLink result; 
if(sibling == NULL){ 
     result = malloc(sizeof (struct dictEdge)); 
     result->thisChar = string[0]; 
     result->sibling = NULL; 
     result->child = insertWordDictR(string + 1, result, &(result->isTerminal)); 

}else if(string[0] < sibling->thisChar){ 
     result = malloc(sizeof (struct dictEdge)); 
     result->thisChar = string[0]; 
     result->sibling = sibling; 
     result->child = insertWordDictR(string + 1, result, &(result->isTerminal)); 

    }else if(string[0] == sibling->thisChar){ 
     /* "result" has not been initialized, &(result->isTerminal) is an invalid pointer */ 
     sibling->child = insertWordDictR(string + 1, result, &(result->isTerminal)); 
    result = sibling; 
1

您正在傳遞一個無效指針作爲參數isTeminal。你必須顯示電話告訴我們爲什麼。

0

從段錯誤,看起來string有一個非常不同的地址比isTerminal。調用這個函數有一些問題,例如,你可能正在傳遞堆棧中的變量的指針,並且由於某種原因,架構不允許它。

我的猜測是isTerminal是你拿指針的局部變量,並且在調用insertWorkDictR之前超出了範圍。

希望它有幫助。

2

可能有其他錯誤,但在第35行中dictionary.c你做:

sibling->child = insertWordDictR(string + 1, result, &(result->isTerminal)); 

然而,無處在的代碼路徑result分配的,所以你傳遞一個未初始化的指針insertWordDictR。