【发布时间】:2012-03-05 03:09:03
【问题描述】:
我用 C 语言制作了一个基本的 LinkedList,我可以创建、添加和开始工作。除了 get 在看似随机数量的 get 调用(第 96 次调用失败,列表中有 94 个元素)后会导致段错误外,访问当前节点上的 next 指针会导致段错误。
这一行导致了段错误while(cur->next != null && i < index) 我已经检查过,并且在段错误发生之前 cur 没有返回空内存地址。它还会在导致它崩溃的调用的第二个循环中崩溃(第二个 printf 仅输出 0)。
这是整个get函数
void *linkedList_get(LinkedList list, int index)
{
Node *cur = list.head;
int i = 0;
if(index != 0)
{
while(cur->next != null && i < index)
{
cur = cur->next;
printf("I %i\n", i);
printf("%i\n", cur);
i++;
}
}
if(index == i)
return cur->data;
return null;
}
这是节点结构
typedef struct
{
void *data;
struct Node *next;
struct Node *prev;
} Node;
如果需要的话,这是完整的代码http://pastebin.com/hpWA8tb8(注意这是我的第一个 C 程序,所以它可能有点草率而且我没有释放任何内存)
【问题讨论】:
-
可能不是你的 bug 的来源,但你应该修改上面的函数,在取消引用 cur->next 之前检查以确保 list.head 不为 NULL。
-
如果在调试器下运行这个程序,发生段错误时调用栈是什么样的?
-
我正在使用带有 Mingw32 的 Code::Blocks 并且由于某种原因调试器拒绝工作,这使得调试我作为初学者 C 程序员引起的大量段错误非常难以调试哈哈。
-
我从不关心 C++,但我主要是一名 Java 程序员,所以 OOP 是我的背景。为什么不用typedef呢?我知道的唯一区别是我必须做 struct structname varname 而不是 structname varname 这对我来说似乎更好。
标签: c memory struct segmentation-fault