我只是在搞乱链表,但似乎我有很多事情错在我的脑海里。我试过这个函数,我不能让它工作。我以为我可以通过简化它来解决问题,但它仍然不起作用。它通常只打印第一个元素,然后是随机的大数字(很可能是内存地址)
我只是想创建一个列表并打印它的内容。
#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;
}
在将Conductor->next
分配给Conductor
之前,应该先为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;
}
在分配之前进行分配是很重要的,否则"旧的"Conductor->next
将不会指向新的Conductor
。
不能为next
指针分配内存
您需要在分配之前分配:
scanf("%d", &(Conductor->value));
Conductor->next = malloc(sizeof(Elem));
Conductor = Conductor->next;
内存应该分配给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;
}
在这里:Conductor = Conductor->next;
导体被分配了一个NULL值,所以当你试图在循环的下一次迭代中解引用它来存储输入值时,你会得到一个分段错误。
正如其他人指出的那样,您应该首先使用malloc
为Conductor->next
分配内存。
我最后可以推荐你看一下调试器,比如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
很容易看出我们有一个问题,在下一个循环中,它将被分配一个无效的值;