我正在用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的新手并且在苦苦挣扎。谢谢。
答案 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;
}
顺便说一下,我的观点是指针在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 allocation,pointer aliasing,undefined behavior,garbage collection;仔细阅读malloc(3);考虑(至少在Linux上)使用像valgrind这样的内存泄漏检测器。