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,还有一个名为“testing”的输入文件。
答案 0 :(得分: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 :(得分:2)
可能还有其他错误,但在dictionary.c的第35行,您可以:
sibling->child = insertWordDictR(string + 1, result, &(result->isTerminal));
但是,代码路径中没有任何地方分配result
,因此您将未经初始化的指针传递给insertWordDictR。
答案 2 :(得分:1)
您正在传递一个无效指针作为参数isTeminal。你必须要求我们告诉你原因。
答案 3 :(得分:0)
从段错误来看,string
的地址似乎与isTerminal
的地址截然不同。调用此函数存在一些问题,例如,您正在传递堆栈上的变量的指针,并且由于某种原因,架构不允许它。
我的猜测是isTerminal
是您接受指针的局部变量,在调用insertWorkDictR
之前它已超出范围。
希望它有所帮助。