2011-05-21 68 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。