文件操作,释放内存出错

[复制链接]
查看11 | 回复5 | 2011-9-5 08:05:55 | 显示全部楼层 |阅读模式
#includestdio.h#includestring.h#includectype.h#includestdlib.h#defineA10char*shuru(void);intmain(void){char*s=NULL;inta=0;FILE*p=NULL;charc=0;char*m=\"D:\\\\我的文档\\\\c.txt\";if((p=fopen(m,\"w\"))==NULL){printf(\"打开文件失败\\n\");exit(1);}do{s=shuru();a=strlen(s);fwrite(fwrite(s,sizeof(char),a,p);free(s);printf(\"是否继续输入?\");scanf(\"%c\",}while(tolower(c)==\'y\');fclose(p);p=fopen(m,\"r\");while(1){fread(if(feof(p))break;s=(char*)malloc(sizeof(char)*(a1));fread(s,sizeof(char),a,p);s[a]=\'\\0\';printf(\"%s\\n\",s);free(s);}fclose(p);return0;}char*shuru(void){char*t=NULL,*s=NULL;inti=0,j=0,b=A;s=(char*)malloc(A*sizeof(char));fflush(stdin);while((s=getchar())!=\'\\n\')if(i==b){b=2;t=(char*)malloc(sizeof(char)*b);for(j=0;ji;j)t[j]=s[j];free(s);s=t;t=NULL;}s[i-1]=\'\\0\';returns;}任意长度字符串写入文件#defineA10intmain(void){fpos_t*k=NULL;FILE*p=NULL,*p1=NULL;char*m=\"D:\\\\我的文档\\\\c.txt\",*m1=\"D:\\\\我的文档\\\\d.txt\",*s=(char*)malloc(A);inti=0,j=0,a=0;if(!(p=fopen(m,\"r\"))){printf(\"打开文件失败\\n\");exit(1);}while(1){fread(if(feof(p))break;if(a=A){free(s);s=(char*)malloc(a1);}fread(s,sizeof(char),a,p);i;}rewind(p);k=(fpos_t*)malloc(sizeof(fpos_t)*i);for(j=0;ji;j){fgetpos(p,kj);fread(fread(s,a,1,p);}if(!(p1=fopen(m1,\"w\"))){printf(\"打开文件失败\\n\");exit(1);}for(j=i-1;j=0;j--){fsetpos(p,kj);fread(fwrite(fread(s,a,1,p);fwrite(s,a,1,p1);}fclose(p);fclose(p1);if(!(p1=fopen(m1,\"r\"))){printf(\"打开文件失败\\n\");exit(1);}for(j=0;ji;j){fread(fread(s,a,1,p1);s[a]=\'\\0\';printf(\"%s\\n\",s);}fclose(p1);free(k);free(s);/*这一行没有就正确*/return0;}反向读取文件再写入一个新文件,释放内存就出错,求高手
回复

使用道具 举报

千问 | 2011-9-5 08:05:55 | 显示全部楼层
关键在于内存申请的大小不对,导致内存溢出。free的时候出错。为什么不对呢?看你的这段程序:fread(if(feof(p))break;if(a=A){free(s);s=(char*)malloc(a1);}假设三个字符串的长度分别为61216一点问题都没有但是假设长度为16126会发生什么问题呢?就是经过上面这个循环之后s所分配的长度是12,而正确的应该是最大的16.你的程序错在把最后一个大于10的长度作为s的内存长度。正确的应该是把最大的长度作为s的内存长度。好了这样改就对了用一个maxsize变量记录一下:intmaxsize=A;fread(if(feof(p))break;if(amaxsize){maxsize=a1;free(s);s=(char*)malloc(maxsize);}这样就ok了
回复

使用道具 举报

千问 | 2011-9-5 08:05:55 | 显示全部楼层
运行平台是?追问vc6第一个main函数将任意长度的字符串写入文件;第二个main函数反向读取第一个main函数保存下来的文件,写入一个新文件中,然后再读取新文件并输出例:运行第一个main函数输入:qwrrer是否继续输入y输入:sgsgdfg是否继续输入y输入:djhzfdhgh是否继续输入n之后程序关闭;运行第二个main函数则输出djhzfdhghsgsgdfgqwrrer
回复

使用道具 举报

千问 | 2011-9-5 08:05:55 | 显示全部楼层
VC6下我运行OK埃你的具体错误提示是什么?还有,你在第一个程序输入了些什么,第二个程序才跳出异常来的?
回复

使用道具 举报

千问 | 2011-9-5 08:05:55 | 显示全部楼层
可以肯定第一个程序随便输入什么都没关系的,第二个程序只要有free(s)这一行,就会出错
回复

使用道具 举报

千问 | 2011-9-5 08:05:55 | 显示全部楼层
代码太杂了,而且有2个main不知道你是用哪个,我看的是后面那个分析后面那个main,第一个while(1)循环中if(a=A)这个有问题,因为你读取的时候是用int来读取,最后放到a中,这个数值,可能是一个很大的数值,会导致s无法分配.不过如果你是按大小内容的方式存储数据的话则没有问题,并且你每次都放到s,但是没有一个全局的数据区来保存你的数据.如果不用全局缓冲区那么你这个时候就可以打开新文件来写入了哦然后接下来是个for循环,这个循环完全没意义,因为上面的代码就可以读出来了,但是存在的问题是,这个for循环使用了s作为其数据缓冲区.如果说你上面的数据内容没问题的话,那么这里也应该会没问题,但是你用了循环,结果这2个循环的意义只是用来读取字段的大小吗,那么为什么不一次就完成循环然后写入呢注意,你这个时候并没有释放过s并且重新分配他的内存,所以这个时候这个s就是你最后一次在上面那个while(1)分配过的大小,也就是说如果你的本意是s为最大的内存缓冲区,那么你应该将常量A变成一个变量,比如max_buff_size之类的,并在每次分配内存后重新修改他的大小,因此s的使用在之后是内存越界的,所以释放会出错也不难理解了.代码问题太多了--就这样了吧追问第一个main函数将任意长度的字符串写入文件;第二个main函数反向读取第一个main函数保存下来的文件,写入一个新文件中,然后再读取新文件并输出例:运行第一个main函数输入:qwrrer是否继续输入y输入:sgsgdfg是否继续输入y输入:djhzfdhgh是否继续输入n之后程序关闭;运行第二个main函数则输出djhzfdhghsgsgdfgqwrrer高手再帮忙看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行