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

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

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/

10-09 18:20