我只是搞乱链接列表,但似乎我脑子里有很多错误。我用功能尝试了这个,但我无法使用它。我认为通过简化它可以使它变得正确,但它仍然不起作用。它通常只打印第一个元素,然后是随机的大数字(最有可能是内存地址)
我只是想创建一个列表并打印其内容。
#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;
}
答案 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->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
很容易看到我们遇到问题,因为在下一个循环中它将被分配一个无效值;