我正在开发一个程序,该程序读取文本文件并动态分配与文本文件大小相同的内存。然后,它允许用户选择不同的选项来对文本文件中的数据执行操作。其中一个选项是通过输入十进制数(0-255)或十六进制数(0x00-0xFF)来搜索特定字符。每当我测试这个选项时,我都会得到一个双重释放或损坏错误,该错误与释放为指针分配的内存有关,指针指向输入字符在内存中的位置。除了由于这个错误而停止程序之外,我编写的函数正确地执行了给定的任务。我已经包含了函数代码和我自己的函数safeFree,它释放了分配的内存并使指针为NULL。如果我不释放内存,程序将继续执行,但内存会泄漏。如有任何帮助,我们将不胜感激。
char *find=(char *)malloc(5*sizeof(char));
int num;
printf("Enter a decimal 0-255 or hex value 0x00-0xFF.n");
scanf("%s",find);
while(getchar()!='n');
if(strncasecmp("0x",find,2)==0)
{
num=strtol(find,0,16);
}
else num=atoi(find);
safeFree(find);
printf("num=%d",num);
if(num<0 || num>255)
{
printf("Invalid entry for this option.n");
}
else
{
char *locptr=malloc(sizeof(char));
locptr=strchr(data,num);
if(locptr<data || locptr>data+a) printf("Character not found.n");
else
{
while((long int)locptr%16!=0) locptr-=sizeof(char);
printf("ntt");
int i;
for(i=0; i<16; i++) printf("%d ",(i%10));
printf("n[%lu]t",(long int)locptr);
for(i=0; i<16; i++)
{
printf("%c ",*(locptr+i));
}
printf("ntt");
for(i=0; i<16; i++)
{
printf("%2.2X ",*(locptr+i));
}
printf("ntt");
for(i=0; i<16; i++)
{
if(*(locptr+i)==num) printf("^ ");
else if(locptr+i<data || locptr+i>data+a) printf(". ");
else if(*(locptr+i)=='n') printf(" ");
else if(*(locptr+i)==' ') printf(". ");
else printf(" ");
}
printf("n");
safeFree(locptr);
}
}
这:
char *locptr=malloc(sizeof(char));
locptr=strchr(data,num);
是灾难的处方。您不应该更改用作已分配内存句柄的指针的值,因为释放内存时会使用该句柄。
在这里,您已经更改了地址,并实际尝试释放内存中的另一部分,甚至可能释放堆栈上的内存(取决于data
所在的位置)。
此外,您不应该只为一个临时char
分配内存。这就像要求租一套suqare英尺的公寓。你可能搞错了如何使用指针。您不必为每个指针分配内存。大多数指针指向已经存在的东西,比如strchr
的结果:它要么是NULL
,这意味着它不指向任何地方,要么指向搜索字符串中的有效字符。没有必要在这里进行分配。
因此,这个:
char *locptr=malloc(sizeof(char));
locptr=strchr(data,num);
if(locptr<data || locptr>data+a) printf("Character not found.n");
应该是:
char *locptr = strchr(data, num);
if (locptr == NULL) printf("Character not found.n");
当结果为NULL
时,只能在sraeched字符串的范围之外。(strchr
的实现保证了这一点。)
此处的代码不正确:
char *locptr=malloc(sizeof(char));
locptr=strchr(data,num);
因为strchr返回的指针指向字符串中第一个出现的字符。locptr不需要malloc/free。
详细信息:strchr
BR,Alex