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