我在C中创建了一个基本的LinkedList,我有创建,添加和工作。除了在看似随机数量的get调用之后得到段错误(第96次调用失败,列表中有94个元素)访问当前节点上的下一个指针会导致段错误。
此行导致我检查过的段错误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;
}
这是Node结构
typedef struct
{
void *data;
struct Node *next;
struct Node *prev;
} Node;
这是整个代码,如果需要http://pastebin.com/hpWA8tb8(注意这是我的第一个C程序,所以它可能有点草率,我不释放任何内存)
答案 0 :(得分:1)
createEmptyNode
实际上并未返回n
。这意味着链表中使用的节点指针实际上是伪造的(并指向内存中的任何位置)。对于许多其他创建函数也是如此。
您应该在启用警告的情况下进行编译,这可能会发生这种情况。 (例如,在GCC上使用-Wall
。)
通常,如果C程序中存在任何内存错误,则在触发该错误后,您无法完全理解其行为。所以我不会声称修复它会使它工作。 ;-)还有一个错误,你在一个节点中设置数据,分配指针而不是指针的内容(你应该使用memmove
之类的东西,明确地传递内容的大小)。
答案 1 :(得分:1)
这是危险的错误,尤其是在64位操作系统和编译时,sizeof指针大于sizeof(int)。
Node *n = malloc(sizeof(int) * 3);
应该是:
Node *n = malloc(sizeof(Node));
答案 2 :(得分:1)
正如Edmund所说,这个程序可能有很多错误,
我反对这一部分:
next->data = malloc(sizeof(data));
next->data = data;
它为next-&gt;数据分配一些内存,然后IMMEDIATELY擦除该指针,并输入不同的值。记忆肯定会泄露,并可能导致其他后果。