c - 为什么会出现这个段错误?

标签 c debugging enums segmentation-fault

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”的输入文件。

最佳答案

在此序列中,您从未初始化的指针中获取字段的地址,如插入的注释所示:

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;

关于c - 为什么会出现这个段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081753/

相关文章:

我不能在数组中使用 double 吗?

c - 垂直直方图阵列打印问题

c - 使用 time(NULL) 在 C 中创建 Delay() 函数时遇到问题

node.js - 如何将 Visual Studio 代码调试器附加到在 nginx 代理后面的 docker 机器上运行的 Node.JS 应用程序

java - 有效地将java字符串转换为其等效的枚举

casting - D 中的枚举类型安全

c - 根据指针的字符串长度?

c - 对指向 int 的指针进行类型转换。

nhibernate - 数据库和 O/RM 中的枚举

c - 如何在C中获取mac os的主机名