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

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

编辑:说三道四文库 发布时间:2017-12-18 12:01
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!!终于被你找到问题啦!
 太谢谢你了!
微软或将于四月发布“返璞归真”的Windows 8.1 Update 1 《近匠》第14期:LiveCode——全民开发工具 美团梁堰波:用SQL-on-Hadoop构建互联网数据仓库与商务智能系统 程序员游戏Style:亚特兰大极客使用机器学习玩转Flappy Bird Gleasy CTO薛珂:成立3年,企业用户2万+,移动办公蕴藏较大发展机遇 Unity Awards展区“点亮”Unity亚洲开发者大会 DevBox:最实用的移动开发辅助工具包 【技术博客推荐】创客程序员设计实现最小物联网系统 MySQL还是NoSQL:开源盛世下的数据库该如何选择 利用Hadoop Streaming处理二进制格式文件 如果没有强大的API,那么还是与OpenStack兼容吧 企业社交工具为何走向衰退? 封闭还是开放?雅虎禁止用户使用Facebook、谷歌ID登录和使用其服务 【OSTC讲师专访】罗聪翼:付出和回报在开源世界成正比 近匠:“词Ci”——全栈“女神”如何诠释倾城之美 国内首届引擎黑客松Cocos2d-x Hackathon即将开赛! 抛弃CloudStack,GoDaddy加入OpenStack PaaS平台之争:Cloud Foundry是赢家吗? 投资超140亿美元,涨幅达30%,数据密集型应用将占领第三平台 汽车开放平台:看看通用汽车是怎么做API的 Gamebase将推全新跨平台3D游戏引擎Reach3dx 借助API Telegram能否成为第二个WhatsApp 机器学习也感性:90后软妹纸的编程之路 为安防与视频监控而生 西数紫盘首发 秘闻:鲍尔默离职,或与坚持收购诺基亚有关 【OSTC讲师专访】Thomas Yao:开源社区最缺有能力的领导者 对比MySQL,你究竟在什么时候更需要MongoDB 不以“大小”论英雄,对比IBM、AWS,谁才是Hadoop界的MVP? 参加“我们都用JIRA”视频征集大赛 赢取乐视TV超级电视 开发者下一个待开发市场:印度 一周消息树:80%开发者背井离乡,70%经常加班 静态编译为.lib文件,错误:hh.res : warning LNK4221: no public symbols found; archive member will be inaccessible C中的free()函数问题! 做VCL的兄弟们,怎么检测窗体上控件的添加和删除?? 我想配置AMD系统,价格在4000元,不知道谁可以给我配置一下!!!性能要好,速度要快!!! 软件大师论共享 如何保存修改过的shp文件 bean中输出的表格与jsp中的表格的嵌套如何解决(高分相送,在线等待) CArchive& AFXAPI operator>>(CArchive& ar,class_name* &pOb)是什么意思 上班一个月,领工资发现加了100,感觉不错 小问题,大家帮帮忙! 请问怎样用命令代替手工来打开treeview的下一层节点? JBuilder运行与数据库连接程序的问题 增样用ASP调用sql server数据库。 谁有Tomcat中使用连接池的完整的例子,主要是在代码中如何关闭连接池? 寻求,批量处理图像尺寸大小的控件!!(vb和vb.net)100分 关于asp与jsp的兼容 急救 请教,我安装了java sdk后又安装了oracle 8,为什么安装后就有‘java.exe 错误,内存只读的错误’? 如何把數據庫中查詢得到的表導入到excel生成報表? 请问用MAIL如何写信 我也来出一道智力题,30分钟内做不出的只有高中生水平 如何在VC中打开别一个窗口或DIALOG 请问Sendmail是否是SOLARIS中必要的 关于代码动态编译的问题,bucher (无人永生) 以及所有会这方面的人请进!!!急!!! Duvessa发布基于用例的估算工具 log4j问题 Borland发布C++ BuilderX整合UML 关于动态创建数据窗口的问题,请各位大虾帮忙,答对的给100分 请教关于打包的问题? 【【【 asp.net 中Excel现程怎么杀掉!!!! 】】】 如何在HTML中嵌入ftpClient功能 請求幫助 一个关于父子进程的问题,请大家帮帮忙好吗?急死我了! 【调查】看看你对流行音乐到底懂得多少? 有没有办法禁止类似用CCPROXY的非法代理? CSS的使用问题 怎样适用odbc连接远程access? DelPhi的错误! 如何通过共享Model上网? 用FileSystemObject 写多行txt,如何实现换行写入??? 你的邮箱已经被别人使用,请使用一个DOMINO服务器,如何解决? 清空文本文件 我编写了一个dos批处理文件bat,要在bat文件运行后自动关闭dos窗口怎么办? 急救:机器出问题了,大家帮忙看看 谁能谈谈XP的激活问题!? 有问题的问题1 有问题的问题 安装visual studio.net 2003 的问题? 急件!请教了,如何在一个字符串中提取第n次出现的字符? weblogic及EJB属于中间层的吗? 到水园第一件事就是看看斑竹有没有换,嘻嘻,还有谁也是这样的? 想自学英语但是不知从哪一步开始,希望大家给点意见哈! 228除以个什么数等于什么数余数是8,除数最小是几 良组词有哪些 求平行四边形和三角形的面积,高人求解! 料峭是什么意思? 娇娇又是什么意思? "既陈而后击之"中的通假字? 对对联:柴门犬吠炊烟袅 料峭的料是什么意思!? 三角形的面积如何求?现在需要,急!~~~~~~一个三角形的底是20厘米,高是底的比是4:5,求这个三角形的面积?【我需要详细的答案!】 谁能告诉我知道三角形边长怎样求面积 为什么柳枝插土里也能成活 杭州规定企业拒绝工资集体协商将最高被韩媒:朝鲜军工厂和军列连发火灾 或系党校专家:三中全会部署政治体制改革国研中心:设自贸区不需时间表 成熟一环球时报:决不让暴恐分子制造社会隔阂土耳其已否决“采购中国红旗导弹”的早\"三无领袖\"安倍疯言疯语录美国全球监控地图曝光:中国5大城市成美卫生部长为医改网站故障道歉美曾要日修宪 日30多年前本可制核武奥巴马再提名支持者当大使为“涉险滩”“啃硬骨头”保驾护航(人“诚信纳税贷”将惠及2.8万陕西企业首个电视孔子课堂落户埃及(国际视点)湖州“绿”“富”谋共赢人老了,家还回得去吗(民生调查·关注今年底进行特别提款权货币篮子评估温何故,知何新(编辑札记)孙杨实现三连冠助学贷款 请勿拖欠(且行且思)印度两列火车脱轨已造成31人死亡美国人对于黑人所受待遇满意度降至15越界复仇桃核地主启神战记真武神王舰娘相伴的水平线玄宇幻宙班花的贴身高手魔法少女小圆之星盟警探梦想无限之旅天仙经纪人终极进化之跃苍穹镇岳宫旅游避诏崖旅游日月岩旅游瞻紫楼旅游老子骑牛旅游灵符遗址旅游太初圣宫旅游静安公园旅游丹洲古城旅游元阳观音山旅游龙树坝梯田旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘