【问题标题】:Why does this segfault?为什么会出现这个段错误?
【发布时间】:2011-05-21 12:33:50
【问题描述】:
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”的输入文件。

【问题讨论】:

  • 发布您调用 insertWordDictR 函数的代码,包括您传递给该函数的所有变量的定义
  • 我建议启用额外的编译器警告...例如如果您使用 gcc,“-Wall”命令行选项可能会警告未初始化使用“结果”。

标签: c debugging enums segmentation-fault


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

    可能还有其他错误,但在 dictionary.c 的第 35 行你会这样做:

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

    但是,该代码路径中没有分配result,因此您将未初始化的指针传递给 insertWordDictR。

    【讨论】:

      【解决方案3】:

      您正在传递一个无效指针作为参数 isTeminal。您必须出示电话让我们告诉您原因。

      【讨论】:

        【解决方案4】:

        从 segfault 看来,string 的地址似乎与 isTerminal 非常不同。调用这个函数有一些问题,例如你传递了一个在堆栈上的变量的指针,并且由于某种原因架构不允许它。

        我的猜测是 isTerminal 是您获取指针的局部变量,在调用 insertWorkDictR 之前它超出了范围。

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2013-01-29
          • 2015-04-17
          • 2011-05-18
          • 2019-04-17
          • 2021-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多