gpt4 book ai didi

c - 在打印单链表时,在c程序执行结束时,它显示文件已停止工作

转载 作者:行者123 更新时间:2023-11-30 19:15:45 25 4
gpt4 key购买 nike

我创建了一个单链表并编写了一个方法来打印它。它已经正确编译并运行,但在执行结束时,它显示list.exe(代码编译后生成的文件)已停止工作,并且Windows正在检查解决方案,如下所示。

enter image description here

列表.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,因此当您遍历列表时,您将再次超出列表,导致未定义的行为。雪上加霜的是,您随后尝试通过超出列表末尾来释放您获得的节点。以及释放该内存,而不释放您分配的实际节点。

此外,标记字符串结尾的空字符和空指针之间存在明显的区别。大多数编译器会将 '\0'NULL 计算为相同的实际值,但它们仍然是不同的语义实体。

关于c - 在打印单链表时,在c程序执行结束时,它显示文件已停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31908287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com