| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1330 人关注过本帖
标题:求个关于链表释放的问题 。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

你看malloc()函数的原型,再看自己是怎么用的。

授人以渔,不授人以鱼。
2012-11-26 23:48
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
回复 20楼 有容就大
以后可以找些open source的malloc分析分析,可能一下子没法全看懂,慢慢来,先把指针弄明白了,你还是有潜力的,相信自己
至少你问的这个问题,自己可以完全靠调试弄明白,碰到这种问题,尽量把代码缩小,减小到几句,调一调就出来了
比如说一个申请,一个释放,连续2个申请,连续两个释放,代码不长,一定要自己耐心调一调
2012-11-26 23:53
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
C版块也有一些基础不错的,比如像madfrogme, lz1091914999等等
2012-11-26 23:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
楼主看看人家的示范代码:
程序代码:
// crt_malloc.c
// This program allocates memory with
// malloc, then frees the memory with free.
 

#include <stdlib.h>   // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>

int main( void )
{
   char *string;

   // Allocate space for a path name
   string = malloc( _MAX_PATH );

   // In a C++ file, explicitly cast malloc's return.  For example,
   // string = (char *)malloc( _MAX_PATH );

   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}

授人以渔,不授人以鱼。
2012-11-26 23:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2012-11-27 00:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用bccnyouke在2012-11-26 23:53:27的发言:

以后可以找些open source的malloc分析分析,可能一下子没法全看懂,慢慢来,先把指针弄明白了,你还是有潜力的,相信自己
至少你问的这个问题,自己可以完全靠调试弄明白,碰到这种问题,尽量把代码缩小,减小到几句,调一调就出来了
比如说一个申请,一个释放,连续2个申请,连续两个释放,代码不长,一定要自己耐心调一调

恩 谢谢你的建议 !!

梅尚程荀
马谭杨奚







                                                       
2012-11-27 00:04
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 24楼 TonyDeng
你的意思是要始终注意检查malloc的返回值吧

现在明白我源程序给一个节点开的空间是小了 malloc要人为地计算和注意分配的大小 有点麻烦哦

梅尚程荀
马谭杨奚







                                                       
2012-11-27 00:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
要分配给某种类型的指针,在C++中必须对malloc()的返回值进行强制类型转换给对方,编译器会给你进行内存对齐,否则是不会做的,因为这个函数的返回值本身是void*,而你的接收指针不是void*。你那代码中所进行的强制类型转换,自己把它还原了看是不是SNODE*。好好的数据类型SNODE不用,你偏要用那个被代换过的*LINKLIST。

typedef struct Node
{
    int num;
    struct Node *next;
}SNode, *LinkList;

这个东西,在C++中是不需要写typedef的,下面这样就简明扼要了:

struct SNode
{
    int num;
    struct Node *next;
};

这样,SNode就是一个经典意义上的数据类型,你可以使用SNode或SNode*,不需要再搞什么类型别名。有int就够了,也不需要再给int*起一个类型名称,像API中那些PINT之类的东西,其实没什么必要。

[ 本帖最后由 TonyDeng 于 2012-11-27 00:19 编辑 ]

授人以渔,不授人以鱼。
2012-11-27 00:14
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用TonyDeng在2012-11-27 00:14:54的发言:

要分配给某种类型的指针,在C++中必须对malloc()的返回值进行强制类型转换给对方,编译器会给你进行内存对齐,否则是不会做的,因为这个函数的返回值本身是void*,而你的接收指针不是void*。你那代码中所进行的强制类型转换,自己把它还原了看是不是SNODE*。好好的数据类型SNODE不用,你偏要用那个被代换过的*LINKLIST。

typedef struct Node
{
    int num;
    struct Node *next;
}SNode, *LinkList;

这个东西,在C++中是不需要写typedef的,下面这样就简明扼要了:

struct SNode
{
    int num;
    struct Node *next;
};

这样,SNode就是一个经典意义上的数据类型,你可以使用SNode或SNode*,不需要再搞什么类型别名。有int就够了,也不需要再给int*起一个类型名称,像API中那些PINT之类的东西,其实没什么必要。

谢谢 老大给俺讲这么多 知道了不少东西 我再琢磨琢磨
现在改习惯了 1点之前必须睡觉 早上好早早起来锻炼身体! 呵呵 。
洗脸 漱口 泡脚 睡觉去 哈哈
老大 晚安。

梅尚程荀
马谭杨奚







                                                       
2012-11-27 00:30
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 19楼 bccnyouke
去搞了个小实验 想验证下malloc分配的BLOCK结构
发现个有趣的现象
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode
{

    struct LNode *next;
    int num;
    float fl;
    double du;
}LNode, *LinkList;


LNode* ApplyMem(LNode *head)
{
    LNode *p;
    int i, j;
    i = sizeof(LinkList);
    j = sizeof(LNode);
    printf("%d %d\n", i, j); //输出的是i, j
    if (NULL == head)
    {
        head = (LNode *)malloc(1 * sizeof(LinkList));

        if (!head)
        {
            printf("Apply fail!\n");
            return NULL;
        }
    }
    head->next = NULL;
    head->num = 1;
    //head->ch = 'a';
    head->fl = 1.2;
    head->du = 22.0;

    p = (LNode *)malloc(1 * sizeof(LinkList));
    if (!p)
    {
        printf("Apply fail!\n");
        return NULL;
    }
    p->num = 2;
    //p->ch = 'b';
    p->fl = 2.4;
    p->du = 54.0435;

    p->next = head->next;
    head->next = p;
    return head;
}

void FreeMem(LNode *head)
{
    LNode *p;
    while (NULL != head)
    {
        p = head;
        head = head->next;
        free(p);
    }
}

void PrintList(LinkList head)
{
    LinkList p;
    p = head;
    while (NULL != p)
    {
        printf("%d %f %f", p->num, p->fl, p->du);
        p = p->next;
    }
}

int main(void)
{
    LNode *head = NULL;
    head = ApplyMem(head);
    PrintList(head);
    //free(head);
    head = NULL;
    return 0;
}
实验时先不释放。
我上面这个程序运行也错误 如果改成(LNode *)malloc(2 * sizeof(LinkList));就能打印
但是2 * sizeof(LinkList) = 8也远小于LNode的实际大小(24)所以当添加上free后报错。
为什么会这样
后来查了下资料 原来malloc(STRUCT_SIZE)分配的内存实际要比STRUCT_SIZE要大
即在用户申请的空间前malloc隐式的分配了若干个字节用来写入被分配内存的信息 free函数就是
通过这个东西来释放内存的
如果用户申请的内存比结构体的size小了 在给结构体赋值时填充的内容会占用‘分配内存的信息’的
那块空间 即BLOCK结构被破坏 free必然出错。如果还没超出整个分配内存,打印没问题,如果超出了
那么打印也无法进行。
这个算是我的理解 具体的细节还不甚了了 不知道理解的对不对?

梅尚程荀
马谭杨奚







                                                       
2012-11-28 07:49
快速回复:求个关于链表释放的问题 。
数据加载中...
 
   



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

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