C - 访问非空指针结构的成员时的Segfault

时间:2012-03-05 03:09:04

标签: c memory struct segmentation-fault

我在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程序,所以它可能有点草率,我不释放任何内存)

3 个答案:

答案 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擦除该指针,并输入不同的值。记忆肯定会泄露,并可能导致其他后果。