如何识别分段错误?

时间:2016-02-09 22:08:38

标签: c segmentation-fault

我正在尝试定义一个接受已经打开的文件的文件指针的函数和一个指向String类型结构的指针,我已经定义了这样的结构:

typedef struct string {
  char* char_arr;
  int capacity;
  int size;
} String;

如果函数能够从文件中读取并将第一个单词放入String中,则返回1,否则返回0。然而,当我运行它时,我收到“分段错误”消息。我读到这涉及滥用指针,但我无法找到发生的位置。

int string_extraction(FILE* pFile, String* pString){
  char* c_string;
  int i;
  char c;

  fscanf(pFile, " %c", &c);

  for(i=0; !isspace(c) && c != EOF; i++){
  c_string[i] = c;
  c = fgetc(pFile);
  }
  ungetc(c, pFile);

  pString = (String*)malloc(sizeof(String));
  if (pString != NULL) {
    pString->size = i;
    pString->capacity = i+1;
    pString->char_arr = (char*)malloc(sizeof(char) * (pString->capacity));        
    if (pString->char_arr == NULL) {
      free(pString);
      pString = NULL;
    } else pString->char_arr = c_string;
  }

  if(pString == NULL)
    return 0;
  return 1;
}

2 个答案:

答案 0 :(得分:1)

正如您所要求的那样,如何识别'段错误,而不是代码中的错误,这里有关于该主题的一些话......

您可以在调试器中运行您的程序,该调试器能够捕获这种错误并引导您到代码中的正确位置。如果您使用的环境为您提供GNU工具,您可以使用 gcc gdb

为了能够充分利用gdb,您需要重新编译程序以添加调试符号:

gcc -g your-awesome-program.c -o your-awesome-program

你可以阅读gdb调试标志here

没有在gdb中运行你的程序:

gdb your-awesome-program

键入r(+ enter)以运行应用程序,您将得到一些输出,如下所示:

(gdb) r
Starting program: /some/where/over/the/rainbow/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400775 in string_extraction (pFile=0x601010, pString=0x7fffffffe310) at ex.c:31
31      c_string[i] = c;
(gdb) bt
#0  0x0000000000400775 in string_extraction (pFile=0x601010, pString=0x7fffffffe310) at ex.c:31
#1  0x000000000040072a in main () at ex.c:18
(gdb) 

c_string [i] = c; 告诉您,发生了段错误。命令 bt 显示调用堆栈,以便您可以跟踪应用程序的流程,直到它被一次严重事故杀死。

您可以阅读有关gdb here的更多信息。

学习如何使用像gdb这样的调试器进行调试可以节省大量时间。

答案 1 :(得分:0)

  

char * c_string;

Segfault,因为您的src指针未初始化。

在循环中使用之前,请先使用c_stringchar []指针。

malloc