| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 397 人关注过本帖
标题:关于动态内存释放的问题
只看楼主 加入收藏
tracyxia716
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2012-12-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
关于动态内存释放的问题
这是c primer plus上第十七章的一个示例程序的源代码:
#include <stdio.h>
#include <stdlib.h>  /* 提供 malloc() 原型 */
#include <stdring.h>  /* 提供 strcpy() 原型 */
#define TSIZE 45    /* 存放片名的数组大小 */

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

int main (void)
{
    struct film * head = NULL;  /* 定义指向结构的头部指针 */
    struct film * prev, * current;
    char input[TSIZE];

    /* 收集并存储信息 */
    puts ("Enter first movet title : ");
    while (gets(input) != NULL && input[0] != '\0')
    {
                /* 输入为真, malloc() 获取存储空间, 并将首地址赋给指针变量 current */
        current = (struct film *) malloc (sizeof (struct film));

        if (head == NULL)  /* 判断是否第一个结构 */
            head = current; /* head 指向分配后内存块的首地址 */
        else               /* 后续的结构 */
            prev->next = current; /* 将下一个结构的首地址赋给前一个结构的 next 成员 */

        current->next = NULL;  /* 表示当前结构是列表中的最后一个 */
        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;   /* 设置 current 指向第一个结构 */

    while (current != NULL) /* 循环过程 直到 指向为空字节 */
    {
        printf ("movie: %s Rating: %d \n", current->title, current->rating);
        current = current->next;   /* 重设 current 以指向列表中的下一个结构 */
    }

    /* 任务已完成, 因此释放所分配的内存 */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf ("Bye \n");

    return 0;
}
每一次运行程序最后都会有错误提示,如果把红色的部分去掉就没问题了。
动态分配内存后都应该释放掉,从理论上分析这段代码应该是没有问题的,可是为什么总是报错(我是在XP操作系统上用VC6.0运行的)?百思不得其解,望详解。
搜索更多相关主题的帖子: 内存 current include rating 
2013-02-23 21:52
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:7 
current = head;
     while (current != NULL)
     {
         free(current);
         current = current->next; // 已经free了,就不要在使用 current->next了
     }
改成这样吧

while (current != NULL)
{
     struct film *temp =  current->next;
     free(current);
     current = temp;
 }



我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-02-23 22:21
lwei
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:197
专家分:369
注 册:2005-5-4
收藏
得分:7 
current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next; //current已经被释放掉了,
    }

2013-02-23 22:54
tracyxia716
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2012-12-29
收藏
得分:0 
回复 3楼 lwei
这个释放有些问题…………我昨天晚上看大话数据结构已经找到问题所在了
2013-02-24 10:58
快速回复:关于动态内存释放的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025943 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved