链接列表错误 - C.

时间:2013-05-31 11:59:49

标签: c linked-list

我只是搞乱链接列表,但似乎我脑子里有很多错误。我用功能尝试了这个,但我无法使用它。我认为通过简化它可以使它变得正确,但它仍然不起作用。它通常只打印第一个元素,然后是随机的大数字(最有可能是内存地址)

我只是想创建一个列表并打印其内容。

#include <stdio.h>
#include <stdlib.h>

struct el{
    int value;
    struct el *next;
};

typedef struct el Elem;



int main()
{
    int nr, i;
    struct el *Head, *Conductor;
    Head = malloc(sizeof(Elem));
    Conductor = Head;
    printf("How many elements do you want to add? ");
    scanf("%d", &nr);
    for(i = 0; i < nr; i++)
    {
        printf("Enter value for element %d:  ", i);
        scanf("%d", &(Conductor->value));
        Conductor = Conductor->next;
        Conductor = malloc(sizeof(Elem));


    }
    free(Conductor->next);
    Conductor->next = NULL;

    Conductor = Head;
    printf("\n");

    for(i = 0; i < nr; i++)
    {
        printf("%d ->  ", Conductor->value);
        Conductor = Conductor->next;
    }

   return 0;
}

4 个答案:

答案 0 :(得分:6)

在将Conductor->next分配给Conductor->next之前,您应该为Conductor分配内存。

for(i = 0; i < nr; i++)
{
    printf("Enter value for element %d:  ", i);
    scanf("%d", &(Conductor->value));
    Conductor->next = malloc(sizeof(Elem));
    Conductor = Conductor->next;
}

在分配之前进行分配非常重要,否则“旧”Conductor->next将不会指向新的Conductor

答案 1 :(得分:5)

您没有为next指针分配内存。

您需要在分配之前分配

scanf("%d", &(Conductor->value));
Conductor->next = malloc(sizeof(Elem));
Conductor = Conductor->next;

答案 2 :(得分:2)

应将内存分配给Conductor->next

按如下方式更改循环,

for(i = 0; i < nr; i++)
{
    printf("Enter value for element %d:  ", i);
    scanf("%d", &(Conductor->value));
    Conductor->next = malloc(sizeof(Elem));
    Conductor = Conductor->next;

}

答案 3 :(得分:1)

就在这里: Conductor = Conductor->next;

为Conductor分配了一个NULL值,因此当您尝试取消引用它以在循环的下一次迭代中存储输入值时,会出现分段错误。

正如其他人指出的那样,您应首先使用Conductor->nextmalloc分配内存。

我最后是否可以建议您查看调试器,例如gdb,因为它可以轻松识别此类问题?

这就是我发现Conductor->next使用gdb:

时出现问题的方法

我完成了整个程序,直到我达到了令人讨厌的指令:

25    Conductor = Conductor->next;

我尝试打印next中的内容:

(gdb) print Conductor->next    

这就是我得到的:

Cannot access memory at address 0x4

这就是我在Conductor

中所拥有的
(gdb) print Conductor
$7 = (struct el *) 0x804b008

很容易看到我们遇到问题,因为在下一个循环中它将被分配一个无效值;