说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请问为什么我传入函数的结构所指向的空间会被无端释放调?(内有源码,希望大家帮我看看)

编辑:说三道四文库 发布时间:2017-10-21 11:24
HTML文档下载 WORD文档下载 PDF文档下载
问题写在底下:
//结构定义
typedef struct _itemset {                        /*---a item set(I)---*/
int         cnt;                             /* number of item in item set*/
int         frq;                             /* the frequent of itemset*/
    ITEM        *ifirst;                         /*the point to the fisrt item link in itemset*/
    NODE        *nfirst;                         /* the point to the first tid node*/
struct _itemset   *next;                     /* point to next itemset in LMFI*/
} ITEMSET;                                       /*( a item set )*/

typedef struct _lmfi {                           /*---local maximal frequent itemset---*/
    int         cnt;                             /* count itemset in LMFI*/
ITEMSET     *pitemset;                       /* point to itemset contained in LMFI*/
} LMFI;                                          /*( local maximal frequent itemset)*/
//声明
LMFI *lmfi;
LMFI newlmfi;

//函数代码
void mfi_merge(LMFI *lmfi, LMFI *newlmfi)
{                                                /*---merge lmfi and newlmfi to one lmfi---*/
int         k,l;                             /* loop variable*/
ITEMSET     *ploopnewits;                    /* loop itemset link in newlmfi*/
ITEMSET     *ploopits;                       /* loop itemset link in lmfi*/
ITEMSET     *ptemp;                         
ITEM        *pitem;                          /* parameter of its_contain(),no use in this function*/
bool        flag = FALSE;                    /* ture if ploopits contain ploopnewits*/
int         count ;                          /* itemset count in newlmfi*/
ploopnewits = newlmfi->pitemset;             /* get itemset link*/
ploopits = lmfi->pitemset;                   
count = newlmfi->cnt;                        /* get count of itemset in newlmfi*/
for(k=0;k<count;k++)             
{                                            /* check each itemset in newlmfi*/
for(l=0;l<lmfi->cnt;l++)
{                                        /* each its(newlmfi) vs all its(lmfi)*/
if(flag = its_contain(ploopits,ploopnewits,&pitem)) /* loopits contain loopnewits*/
break;                           /* don't need contain this loopnewits*/
ploopits = ploopits->next;  /* prepare check next loopits*/
}
if(!flag)                                /* all its in lmfi don't contain loopnewits*/
{
            ptemp = ploopnewits->next;           /* get next its in newlmfi*/
mfi_addits(lmfi,ploopnewits);        /* add loopnewits in lmfi*/
ploopnewits = ptemp;                  /* ploopnewits to next its*/
}
else                                     /* loopnewits contain in lmfi*/
{
ptemp = ploopnewits;                 /* get current no used itemset*/
ploopnewits = ploopnewits->next;     /* check next its in newlmfi*/ 
            its_free(ptemp);                     /* free no used itemset*/
}
flag = FALSE;                            /* reain flag*/
}
}                                                /* mfi_merge()*/


//我的函数调用
mfi_merge(lmfi,&newlmfi);

//问题是,当我调用mfi_merge()之前mewlmfi.pitemset指向一个ITEMSET类型的链表,没有问题都很正确,当我单步运行进入函数,newlmfi->pitemset(注意此时的newlmfi已经是函数调用的参数,为一个指针了)所指向的空间就被释放掉了,里面的值全部乱掉,请问是怎么回事呢? 
ps:但是newlmfi->cnt 的值正确,newlmfi->pitemset这个指针所指的地址是没有变的,只是这个地址的空间好像被释放了。

真的很想知道,谢谢大家了!
源代码里面的注释转贴过来的时候有点问题,对不起了,看的时候可能有点难
void mfi_merge(LMFI *lmfi, LMFI *newlmfi)
{                                                
int         k,l;                             
ITEMSET     *ploopnewits;                    
ITEMSET     *ploopits;                       
ITEMSET     *ptemp;                         
ITEM        *pitem;                          
bool        flag = FALSE;                    
int         count ;                          
ploopnewits = newlmfi->pitemset;             
ploopits = lmfi->pitemset;                   
count = newlmfi->cnt;                        
for(k=0;k<count;k++)             
{                                            
for(l=0;l<lmfi->cnt;l++)
{                                        
     if(flag = its_contain(ploopits,ploopnewits,&pitem)) 
break;                                           ploopits = ploopits->next;
}
if(!flag)                                
{
                           ptemp = ploopnewits->next;           
mfi_addits(lmfi,ploopnewits);        
ploopnewits = ptemp;                  
}
else                                     
{
ptemp = ploopnewits;                 
ploopnewits = ploopnewits->next;      
                            its_free(ptemp);                     
}
flag = FALSE;                            
}
}                                              

好了,我把注释全删了,不顾我想这个问题和函数本身的问题不大
//结构定义
typedef struct _itemset {                        
int         cnt;                             
int         frq;                            
    ITEM        *ifirst;                         
    NODE        *nfirst;                         
struct _itemset   *next;                     
} ITEMSET;                                       

typedef struct _lmfi {                           
    int         cnt;                            
ITEMSET     *pitemset;                      
} LMFI;                                         
//声明
LMFI *lmfi;
LMFI newlmfi;
结构的定义我也删了注释
看在我这么辛苦的分上,有人来帮帮忙撒 !
提供你一个可能的情况!

mfi_addits(lmfi,ploopnewits);
如果你的lmfi在程序里要改变所指的值,最好定义 mfi_addits时它的参数是*& 的.
mfi_addits(LMFI*& ,...); 
函数在传入指针的时候是类似这样的:再建立一个指针指向传入的指针指向的地方.
即:p----->[]      fun(Type* q);
          ^
在fun中q__|
如果你改了q的指向,当fun结束时q就撤销了,但p还是指向原来的地方.如果你把原来的地方释放掉,就会出现你的情况了.所以要用*& refference to pointer.
我只是提供给你一个可能的情况.具体你还要分析.
谢谢snipersu
不过,我觉得现在的问题不是这个函数的是问题,newlmfi在传入mfi_merge()之前的值都是正确的,进入mfi_merge()的时候,newlmfi->cnt和newlmfi->pitemset的值没有变,变的是newlmfi->pitemset所指向空间的值!!!,所以我在想有什么情况下进入一个子函数会释放掉已经分配的链表空间。但单单是进入一个函数,又没有任何对指针的操作,怎么会就无缘无故的出现问题呢?
好象函数没错,是不是你使用他时弄错了。

自己查查,应该是小问题。
要看看调用函数的定义,你的newlmfi是存放在什么的?我怀疑你的newlmfi是另一个函数中的局部变量,这样的话,可能newlmfi已经失效,但是在进入函数前还没有被覆盖,在进入后newlmfi所在的stack空间被部分覆盖,这时会产生你说的问题

关注,我也曾在gcc上遇到这样的问题,但同样的代码在devcpp上却没有问题
支持 Tommy 的猜测。
关于tommy说的 
在我的代码中定义的函数是
int LMFI_backtrack(ITEMSET *itemset,COMBINESET *combineset,LMFI *lmfi,int level,int supcnt)
{
    ...
     LMFI       newlmfi;                         /* lmfi(l+1)*/
    ...
     newlmfi.cnt =0; 
     newlmfi.pitemset = NULL; 
     ...
     mfi_addits(lmfi,&newitemset);//对传进来的lmfi进行添加链表元素
     ...
     LMFI_backtrack(&newitemset,&newcombineset,&newlmfi,level+1,supcnt);
     //递归调用,当然是在一定条件下的递归了
     mfi_merge(lmfi,&newlmfi);//递归返回后将newlmfi和lmfi合并,准备向上一级返回
     ...
}//我的问题是在递归结束(我的例子是三层递归),第一次返回时出现的问题。
请给出递归结束的条件,问题可能出在递归上,好好看看在函数LMFI_backtrack()中有关lmfi的语句是怎么操作的,是否更改limf->pitemset的值,还有,递归里面newlmfi的空间在每层递归结束后都会被释放掉,看看是否与此有关。
LMFI_backtrack中的

mfi_addits(lmfi,&newitemset);//对传进来的lmfi进行添加链表元素

newitemset是从哪来的?是否LMFI_backtrack中定义的局部变量?如果是的话,你就是将一个局部变量加到链表中,这个结点在返回后就失效了。
Tommy!!终于被你找到问题啦!
 太谢谢你了!
如何快速选择一个组件的父亲-Delphi资料 如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 透明FORM-Delphi资料 为列表框添光彩-Delphi资料 限制FORM的大小-Delphi资料 用Delphi开发分隔线组件 用Delphi设计拨动、跳线开关组件 用Delphi 设 计 拨 动、 跳 线 开 关 组 件 用Delphi实现JPEG格式图像的显示 用Delphi制作动态有声标签 运行时生成控件-Delphi资料 在DBGRID中实现COPY、PASTE功能-Delphi资料 在Delphi程序的About窗口中建立URL连接 在Delphi中利用Tbatch组件完成数据批处理 在Delphi中巧改窗体文件实现控件数组化 在Delphi中实现不同风格的SPEED和BUTTON 在Delphi中实现类似VB中的控件数组。 在RichEdit中的串查找-Delphi资料 在按钮中快速启动程序-Delphi资料 怎样读出MEMO控件的当前值-Delphi资料 怎样使用Delphi 5中的TExcelApplication操纵Excel 97/2000 怎样在TDataset中汉英混用-Delphi资料 制作可移动的窗体的MovePanel控件-Delphi资料 制作可移动的分割窗体-Delphi资料 制作用于日期时间型字段的DELPHI数据感知控件 怎么读出上传的文件内容,(根据文件路径)? 在Win2003里用属于Administrator用户组但不是Administrator的用户建一个ADSL上网连接,为什么这个用户自己无权使用呢?怎么才能使它有使 设备文本重画的问题 求 <<ibm pc 匯編語言程序設計>>一書, 送400分. 下载文件时不提示我? JB中写代码时光标的问题 vbscript,如何在客户判断EMAIL正确格试! 西风到底怎么样啊? 众为高手好,小弟下载了个电影,打开时有声音,但是显示不了 ACCESS可以用中文作为表名,但不能读取表? 从0-22 抽出 5个数 这几个数不能相同。怎么版。啊。。 求救! 在窗体中如何对ACCESS数据库中的表格进行访问?--在线求助!! 怎么在程序中使用另一个目录下的class?在线等 如何在datagrid绑定后修改datagrid 的header.text的值? 谁知道在PB8下为什么树型控件无法正确显示汉字,急,马上就给分,在线等候! delphi的系统分析员请进来。 关于输入法的聚焦问题!! 病毒通过附件传播的问题 ORACLE不能自动启动的问题 关于提取字符串的问题 indy 9控件的安装,有没有发布版下载! 菜鸟问题,我这个触发器错在哪里? 郁闷!!!帮帮先!!! 急,表怎么添加不了数据??? 怎样实现MDI框架下,桌面窗体总在所有窗体的最后面? 关于html登录表单 想创业的进来看看! 郁闷!!帮忙先 “上网上了一半,突然间网页全部自动关闭?” 急死了,这是怎么回事? delphi的系统分析员请进来。 许多网页底部都有Disclaimer,请问这个词该怎么理解?谢谢! asp连接 orale进行分页时老出错? 请教:如何从XML文件中动态读出对应的信息?万分感谢 delphi的系统分析员请进来。 在Win2k Server中,如何判断当前用户(或应用)是否有SE_SHUTDOWN_NAME权限?在线... 表单连动怎么写呢?用asp。 一个简单问题,却快让我发疯了,请大家帮忙看看 各位大哥又有问题请教了,现在看到很多网页做成左右2个FrameSet,当中通过一个类似箭头的图片,当点击后,可以缩进一个FrameSet,请问大哥 简单问题求教 急!!!如何在MSHFlesGrid中实现Tab键的功能? Tomcat连接数超过最大连接数时,需重启tomcat,如何解决? 关于XP中测试先行的具体实践办法 重载TCustomComboBox如何使list中选择的内容经过我修改后再填入edit 人因梦想而伟大 请进,有一个关于调用windows函数的问题...... 表的‘所有者’问题 如何为treeview增加二级节点? 请教。。怎么用dwmx开发asp.net呀?感谢! 如何删除文件"-g" 为什么超链接到php下载程序,一下载,网页上的按扭就不起作用了. 一个等腰三角形的一边是5厘米,另一边是7厘米,这个三角形的周长为 为什么有些关键词竞争很大但搜索量却很小,反之竞争相对较小,但搜索量可达几千万.这是怎么回事?比如我用google关键词工具查询Sticker.这个词很广泛,搜索量2,240,000/月,但竞争程度只算中等,而 理论上19%的概率要连续做多少次才能100%成功,给个答案并写出方法 偶然的反义词是什么 我想查一个关键词在网络的搜索量 ”先苦后甜”怎么用英语说呢? 等腰三角形一边5,另一边8,周长是多少 怎么样看一个关键词的竞争量? 魏晋南北朝文化艺术的繁荣与经济的发展具有怎样的关系?文化艺术的繁荣的主要原因?说明白一些,要一条一条那样 白话文什么什么记趣 急 关于Tim drives more slowly than Helen does.Tim drives more slowly than Helen does.Tim drives more slowly than Helen.哪个对?如果第一个错,那该怎么区别这两种用法,也就是说怎样使用.都对的话,为什么没有一本书说过 用先苦后甜举事例 暑假生活记趣 Human resource management more and more drives value.此文题目是什么? 任务型阅读 it is important tp make a study plan foan exam My brother has a good (p ) for coming vacation 用独具匠心和引人入胜造句55—60个字 初二选择填空 Before you learn to do___,you must first___carefully.Before you learn to do___,you must first___carefully.A new something;see B something new;watchC some new things;read D anything new;look(注:说明原因) 八年级上册数学习题11.18题 急.在△ABC中,AB=2,BC=4,△ABC的高AD与CE的比是多少?(提示:利用三角形的面积公式.) 如题.尽快.沈复的《幼时记趣》题目中的记趣的意思 第11题答案 合作的反义词是什么 高数极值.驻点问题求救.驻点就是导数为零的点吗 请问谁知道请推荐一本现代诗歌精选的书有晓得的人就说下哈,我在此先谢谢各位了0Y ( )的欢笑 合作的反义词 岳飞死后还有抗金将领吗 To surf the net for 20 hours 是单数还是复数?怎么区分 LOVE YOU'S GOOD 什么意思 作为一个中国人,我们应该把一生奉献给祖国朋友们给个答案吧!谢谢啦 汉译英 急需带目的成语 you love a good 下面这些人为我们国家作出奉献,他们各是什么家张大千冰心李四光陶行知 英语翻译《Please Come Again RH Brand》 怎么翻译?这里的“RH”是“罗宾汉”的意思~这句话是不是可以翻译成为:《欢迎再度光临罗宾汉品牌》 Good love for you中文是什么? 求当代外国人为中国奉献的事例、急~毛泽东主席写过《纪念白求恩》一文,赞扬白求恩医生放弃在加拿大优越的生活、工作条件,不远万里来到中国,把事业和生命都献给了极其艰苦的中国人民 Please come over again in the future这句话如何翻译 用配方法把解析式y=1+4x-2x2改写成y=a(x+m)2+k的形式 像 什么什么事后面加上不咯 这两个字是哪里的方言? you must first可以这么说么 英语翻译每个人都喜欢这本杂志吗?【弄错了】 已知方程组(x+y)-3(x-y)=7 first there must be oppression before the birth of a revolution 配合的反义词是什么 南宋时期将领我记得岳飞曾经叫杨存中十哥,问一下当时他们是结拜的吗?一共有几人?分别叫什么?(最好按1-10顺序排列下) 有什么办法消除浮躁? 联合的反义词是什么 关于南宋八字军之疑问,达人进,人称南宋四大抗金名将之一.刘琦是个人物!他带的队伍叫“八字军”,脸上都刺上“赤心报国,誓杀金贼”八个字,曾经大破金兀术的“铁浮图”和“拐子马”.以 怎样消除浮躁 协作的反义词可不可以是竞争?求急!3分钟内 解方程:(x/x-1)^2+(x/x+1)^2=40/9 ..= = 怎样去除浮躁现今社会选择更多,竞争压力更大,机会反而相对,更少,人们追求速成,但有很多事都需要时间的累计与沉淀,怎样能够达到平衡? 数学题1+1=1 18+6=1 3+1=41+1=1 18+6=1 3+1=4请问为什么? The aim of young men帮我写一篇英语作文被 我的英语水平是在是太差了 请大家帮帮忙 谢谢! 以后在北京的出版社工作,考中级口译,还是BEC,还是托业,哪个好点呢?我本身学中文的,英语还行,想考个工作有用的证. 一道数学题,第18题…… 关于关键词每天的搜索量作为一个新手很多都不懂,问的这个问题也许很幼稚,希望各位前辈能解解惑.例如:破碎机这个词百度指数显示平均900左右;但是我通过百度账号的后台关键词分析工 -√2的倒数是什么呢? My________(brother)name is Li Hong.(线上写什么) 怎样求证90+2分之一角A成立? 能不能分析一下托业、中级口译、BEC中级的优劣,以及他们的含金量和认可度. 福岛近海发生7.1级地震 最大观察到德国高层代表团将赴美 跟进默克尔被窃浙江监测教育质量评价 5万余名学生“浙江“稻鳖模式”开启生态农业之门浙江民营经济隐现离制造业化 地产投资习近平:让命运共同体意识在周边国家落故宫员工杀2名同事后自杀未遂 警方未浙江民营经济企稳 出口增速重回金融危尼日利亚军方与极端组织极端组织交火打数土文夫:日中关系应回到邦交正常化的俄印蒙三国总理联袂访华 中国周边外交大湄公河次区域经济合作发展与我国经济哥伦比亚妇女售卖12个女儿“初夜权”白俄总统错坐普京座位 发现后起身让座李娜击败阿扎伦卡 首次跻身WTA总决拉美和加勒比能源部长会议关注能源安全世界经济论坛发布全球性别差异新报告美国财政僵局余波未了日媒:4中国军机同日飞越冲绳 日战斗叙“支持阵线”头目或被打死 政府军战莫斯科时装周力推“俄罗斯制造”江西公务员考试473人递补入围面试 江西税收保障办法7月实施 税收保障工江西财大今年招收5200名本科生 大江西今年破获食品安全案136起 5起江西县级商务部门扩权 可审批5000南昌2014年中考结束 20日8时起地质专家杨衍忠先进事迹在全国传诵 引未来4天 江西高温减弱降雨来袭前5月江西进出口总额195.4亿美元南昌小平小道周边整治项目安置房拟建在背景资料:希腊共和国广州重启人才入户 等级和年龄门槛大幅京广线列车脱轨路段恢复通车南昌拟“三庙合一”建南海行宫引争议 《无以回报;捐出自己》追踪:爱涌阿巴米东区西路街道新园社区卫生监督所慰问托里县开展“访惠聚”活动 共创出彩城佳作赏析:四十载情一幅画 牛奶作画雪乌鲁木齐市公园北街附近部分住户6月1公益主角:援疆干部丁瑞康情系呼图壁牧新疆若羌县铁干里克乡各村“赶考”促群
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘