0

我只是在摆弄链接列表,但似乎我脑子里有很多问题。我已经用函数尝试过这个,但我无法让它工作。我以为我会通过使它更简单来解决它,但它仍然不起作用。它通常只打印第一个元素,然后是随机的大数字(最有可能的内存地址)

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

#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

4 回答 4

6

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

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

于 2013-05-31T12:05:26.297 回答
5

您不为next指针分配内存。

您需要在分配之前分配:

scanf("%d", &(Conductor->value));
Conductor->next = malloc(sizeof(Elem));
Conductor = Conductor->next;
于 2013-05-31T12:02:10.813 回答
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;

}
于 2013-05-31T12:05:55.867 回答
1

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

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

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

最后,我是否可以建议您看一下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

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

于 2013-05-31T12:05:52.633 回答