c语言 - *** "./prog5"中的错误:双重释放或损坏(输出):0x0000000001cc3260 *** 中止(核心转储)



我正在开发一个程序,该程序读取文本文件并动态分配与文本文件大小相同的内存。然后,它允许用户选择不同的选项来对文本文件中的数据执行操作。其中一个选项是通过输入十进制数(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

最新更新