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



我正在编写C.我是C的新列表ADT,并且正在尝试将代码从Java转换为C。得到细分故障。

当我在GDB中调试程序时,我会收到以下错误:

程序接收到信号sigsegv,分段故障。0x0000000000400BE8在getIndex()

然后当我输入命令"哪里"我收到以下消息:

#0 0x000000000000400BE8在getIndex()

#1 0x000000000000400806 in main()

以下代码是错误发生的方法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;
}

供参考,犯罪方法和noderef的结构为:

int offEnd(List L) {
   if (L == NULL) {
      printf("List Error: Calling offEnd() on NULL Listn");
      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);
}

我是我的新手和苦苦挣扎的人,任何帮助都将不胜感激。谢谢。

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

 gcc -Wall -g yoursource.c -o yourbinary

当然,请改进代码,直到根本没有警告为止。

也许使用NULL参数调用getIndex。您可以添加

#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;
}

阅读有关断言的(3)。

顺便说一句,我的看法是,指针在C中非常重要,以至于您始终需要阐明它们。因此,请使用typedef struct listnode_st ListNode;并声明ListNode* L(或者也许是ListObj* l,我不知道List是什么),而不是List L。我也更喜欢宏的大写,因此建议使用小写l宣布int getindex(ListNode*l)并相应地调整该功能的主体。

终于,您的newNode是错误的:malloc可能会失败,并且您始终应处理这种故障。因此,从

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

提防内存泄漏;阅读有关C动态内存分配,指针混叠,未定义的行为,垃圾收集的更多信息;仔细阅读malloc(3);使用内存泄漏检测器(如Valgrind)考虑(至少在Linux上)。

相关内容

  • 没有找到相关文章

最新更新