请教C高手帮我瞧瞧错误在哪里?

来源:百度知道 编辑:UC知道 时间:2024/06/06 06:42:46
下面的代码我是实现读123.txt里面的内容来为temp.db1重新命名,如果其内容字符串大於八个则取后八个字符命名;
为什麼我在执行后会出现指针没有定义的错误啊?主要是后面内存释放部分有问题,我实验过的,但是不知道原因,请高手赐教。
void ReName()
{
FILE *Temp;
char *Name,*FileName;
if((Name=(char*)malloc(15*sizeof(char)))==NULL)
{
puts("out of memory");
exit(1);
}
if((FileName=(char*)malloc(15*sizeof(char)))==NULL)
{
puts("out of memory");
exit(1);
}
if((Temp=fopen("ppid.txt","r"))==NULL)
{
puts("There have no ppid.txt file");
exit(1);
}
fscanf(Temp,"%s",Name);
if(strlen(Name)<9)
{
strcat(Name,".db1");
if(rename("temp.db1",Name)!=0)
{
printf("this filename %s has existed!",Name);
free(Name);
exit(1);
}
}
else
{
FileName=Name+strlen(Name)

这样的:
FileName=(char*)malloc(15*sizeof(char)
此句已经为Filename分配空间了,而

FileName=Name+strlen(Name)-8;
此句让Filename重新指向一个单元,造成上一句声请的15个单元挂起。而且

free(Name);
free(FileName);
当读如的字符,大与8个时,会导致后一句释放错误,重复释放某些单元

建议撤消以下语句
if((FileName=(char*)malloc(15*sizeof(char)))==NULL)
{
puts("out of memory");
exit(1);
}

free(FileName);

另外,Name声请的空间可能会短了,会造成FileName=Name+strlen(Name)-8的溢出,(比较危险在超过8个字符的情况下)建议空间定位50

这么改,试一下
else
{
free(FileName);
FileName=Name+strlen(Name)-8;
strcat(FileName,".db1");
if(rename("temp.db1",FileName)!=0)
{
printf("this filename %s has existed!",FileName);
exit(1);
}
}
free(Name);
}
原因,因为FileName指向了Name后八个,所以之前FileName指向的空间所存放的字符已经没有意义了,先要释放掉。
最后只释放free(Name),自然也就包括了FileName,因为它是Name的一部分嘛

看懂了就给分吧