程序中的分段错误,但GDB不显示行号

时间:2014-01-26 09:45:02

标签: c gdb segmentation-fault

我正在用C编写一个List ADT。我是C的新手,我正在尝试将代码从Java转换为C.但是,当我测试List ADT时,我一直遇到分段错误。

当我在GDB中调试程序时,出现以下错误:

  

编程接收信号SIGSEGV,分段故障。   getIndex()

中的0x0000000000400be8

然后当我输入命令“where”时,我收到以下消息:

  getIndex()

中的

#0 0x0000000000400be8      在main()中

#1 0x0000000000400806

下面的代码是发生错误的方法getIndex():

int getIndex(List L) {
   int returnIndex = 0;
   if (offEnd(L)) return -1;
   else {
      NodeRef currIndex = L->curr;
      while (currIndex != L->front) {
         ++returnIndex;
         currIndex = currIndex->prev;
      }
   }
   return returnIndex;
}

作为参考,offEnd()方法和NodeRef的结构是:

int offEnd(List L) {
   if (L == NULL) {
      printf("List Error: Calling offEnd() on NULL List\n");
      exit(1);
   }
   return (L->length == 0);
}

typedef struct Node {
   int data;
   struct Node* next;
   struct Node* prev;
} Node;

typedef Node* NodeRef;

typedef struct ListObj {
   NodeRef front;
   NodeRef back;
   NodeRef curr;
   int length;
} ListObj;

NodeRef newNode(int node_data) {
   NodeRef N = malloc(sizeof(Node));
   N->data = node_data;
   N->next = NULL;
   N->prev = NULL;
   return (N);
}

任何帮助都会受到赞赏,因为我是C的新手并且在苦苦挣扎。谢谢。

1 个答案:

答案 0 :(得分:4)

假设您使用GCC编译器,则应编译所有警告和调试信息

 gcc -Wall -g yoursource.c -o yourbinary

当然,改进代码直到你没有得到任何警告。

可能使用getIndex参数调用NULL。你可以添加

#include <assert.h>

yoursource.c文件和代码的开头附近:

int getIndex(List L) {
  int returnIndex = 0;
  assert (L != NULL);
  if (offEnd(L)) return -1;
  else {
    NodeRef currIndex = L->curr;
    while (currIndex != L->front) {
       ++returnIndex;
       currIndex = currIndex->prev;
    }
 }
 return returnIndex;
}

了解assertassert(3)

顺便说一下,我的观点是指针在C中非常重要,你总是需要明确它们。所以请typedef struct listnode_st ListNode;并声明ListNode* L(或者ListObj* l,我不知道List是什么)而不是List L。我也更喜欢大写的宏,因此建议用int getindex(ListNode*l)声明l并相应地调整该函数的主体。

最后,您的newNode错误:malloc可能会失败,您始终应该处理此类错误。所以用

开始吧
NodeRef newNode(int node_data) {
  NodeRef N = malloc(sizeof(Node));
  if (N == NULL) { perror("malloc Node"); exit (EXIT_FAILURE); };

小心memory leaks;详细了解C dynamic memory allocationpointer aliasingundefined behaviorgarbage collection;仔细阅读malloc(3);考虑(至少在Linux上)使用像valgrind这样的内存泄漏检测器。