我创建了一个单链接列表,并编写了一种打印它的方法。它已经正确编译并运行,但是在执行结束时,它显示list.exe(代码编译后生成的文件)已停止工作,Windows正在检查解决方案,如下所示。
list.c
#include<stdio.h>
#include<stdlib.h>
struct List
{
int a;
List *b;
};
void PrintElement(List *);
int main()
{
List *head,*temp;
int n,k;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
temp->b=(List*)malloc(sizeof(List));
if(i==0)
{
temp=(List*)malloc(sizeof(List));
head=temp;
}
else
{
temp=temp->b;
}
scanf("%d",&temp->a);
}
temp->b='\0';
PrintElement(head);
return(0);
}
void PrintElement(List *head)
{
List *temp1=head;
do
{
printf("%d\n",temp1->a);
temp1=temp1->b;
}
while(temp1!='\0');
free(temp1);
}
谁能解释我在做什么错?
最佳答案
由于此行,您有未定义的行为
temp->b=(List*)malloc(sizeof(List));
至此,您尚未初始化
temp
,但需要进行两行以下的初始化。您也永远不会在任何地方将“下一个”指针
b
初始化为NULL
,因此在遍历列表时,您将走出列表之外,再次导致未定义的行为。为了增加侮辱性伤害,您然后尝试通过走出列表末尾来free
获得的节点。不仅释放该内存,而且不释放您分配的实际节点。同样,标记字符串结尾的空字符与空指针之间也有明显的不同。大多数编译器会将
'\0'
和NULL
评估为相同的实际值,但是它们仍然是不同的语义实体。关于c - 在打印单链表时,在c程序执行结束时,它表明文件已停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31908287/