C 程序中出现分段错误,但GDB没有';不显示行号

C 程序中出现分段错误,但GDB没有';不显示行号,c,gdb,segmentation-fault,C,Gdb,Segmentation Fault,我正在用C编写一个列表ADT。我是C新手,正在尝试将代码从Java翻译成C。然而,当我测试列表ADT时,我总是遇到一个分段错误 在GDB中调试程序时,出现以下错误: 程序接收信号SIGSEGV,分段故障。 getIndex()中的0x0000000000400be8 然后,当我输入命令“where”时,我得到以下消息: #getIndex()中的0 0x0000000000400be8 #1 0x0000000000400806在主目录中() 下面的代码是发生错误的getIndex()方法: i

我正在用C编写一个列表ADT。我是C新手,正在尝试将代码从Java翻译成C。然而,当我测试列表ADT时,我总是遇到一个分段错误

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

程序接收信号SIGSEGV,分段故障。 getIndex()中的0x0000000000400be8

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

#getIndex()中的0 0x0000000000400be8

#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;
}
作为参考,NodeRef的ancrk()方法和结构是:

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

任何帮助都将不胜感激,因为我是C语言的新手,正在努力。谢谢。

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

 gcc -Wall -g yoursource.c -o yourbinary
当然,要改进代码,直到没有任何警告为止

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

#include <assert.h>
了解和了解

顺便说一句,我的观点是指针在C语言中非常重要,所以你总是需要显式地使用它们。因此有一个
typedef结构listnode\u st listnode
并声明
ListNode*L
(或者
ListObj*L
,我不知道什么是
List
),而不是
listl
。对于宏,我也更喜欢大写,因此建议使用小写的
l
声明
intgetindex(ListNode*l)
,并相应地调整函数体

最后,您的
newNode
是错误的:
malloc
可能会失败,您应该始终处理此类失败。那就从这个开始吧

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

提防;阅读更多关于;仔细阅读;考虑(至少在Linux上)使用一个类似于.p/>的内存泄漏检测器,在哪一个操作系统上和哪个编译器(以及哪个版本)在编码?<代码>列表<代码>与代码> ListObj一样吗?显示更多代码,特别是
列表的定义(例如
typedef
)…-1,因为你没有解释什么是
List
,而(currendex!=L->front){
currendex
NULL
?这是一个非常有用的问题,因为我在FreeBSD上遇到了这个问题,并且是通过谷歌发现的。
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;
}
NodeRef newNode(int node_data) {
  NodeRef N = malloc(sizeof(Node));
  if (N == NULL) { perror("malloc Node"); exit (EXIT_FAILURE); };