关于Debug Assertion Failed问题

  书上代码:

#include<stdio.h>
#include<stdlib.h>            /* 提供malloc()、free()函数 */
#include<string.h>

#define TSIZE 45

struct film {
    char title [TSIZE];
    int rating;
    struct film *next;        /* 指向链表的下一个结构 */
};

int main()
{
    struct film *head=NULL;        /* 链表头 */
    struct film *prev,*current;    /* 定义两个film结构型指针 */
    char input[TSIZE];            /* 字符数组 */

    puts("Enter first movie title:");
    while(gets(input)!=NULL && input[0]!='\0')                /* 接收键盘上输入的字符串 */
    {
        current=(struct film *)malloc(sizeof(struct film));    /* 为结构型分配足够的存储空间 */
        if(head==NULL)            /* 第一个节点为空 */
            head=current;        /* 则将地址赋值给头 */
        else                    /* 后续节点 */
            prev->next=current;    /* 将地址赋给结构指针指向前一个结构中的next成员 */
        current->next=NULL;        /* 用空指针给current指向的第二个结构成员next赋空值 */
        strcpy(current->title,input);/* 将电影名赋值给结构型中的标题 */
        puts("Enter your rating <0-10>:");
        scanf("%d",&current->rating);
        while(getchar()!='\n')/* 接收回车符 */
            continue;
        puts("Enter next movie title (empty line to stop):");
        prev=current;/* 接受下轮输入 */
    }

    if(head==NULL)
        printf("No data entered.");
    else
        printf("Here is the movie list:\n");
    current=head;/* 指向头节点 */
    while(current!=NULL)
    {
        printf("Movie: %s Rating: %d\n",current->title,current->rating);
        current=current->next;/* 不断指向下一个 */
    }

    current=head;/* 问题出在这里 */
    while(current!=NULL)/* 内存使用完后释放内存 */
    {
        free(current);
        current=current->next;
    }

    printf("Bye!\n");
    return 0;
}

  迷惑:

去掉 current=head; 后程序才能正常运作。
网上查了一下,也有人提过这个问题,但他的解决方法是将free直接去掉,运行就没问题了。
然后我就奇怪了,难道不用释放内存吗?

  解决:

//再来说说这个问题,释放的代码确实是错误的,正确的释放操作为:

/* 再定义一个结构体类型的指针 temp */
while(current)
{
    temp = current;
    current = current -> next;
    free(temp);
}

  

转载于:https://www.cnblogs.com/darkchii/p/6964438.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值