*** ‘./prog5’ 中的错误:双重释放或损坏(输出):0x0000000001cc3260 *** 中止(核心已转储)

*** Error in `./prog5': double free or corruption (out): 0x0000000001cc3260 *** Aborted (core dumped)

我正在开发一个读取文本文件并动态分配与文本文件大小相同的内存的程序。然后,它允许用户选择不同的选项来对文本文件中的数据执行操作。这些选项之一是通过输入十进制数 (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("\n\t\t");
    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("\n\t\t");
    for(i=0; i<16; i++)
    {
        printf("%2.2X ",*(locptr+i));
    }
    printf("\n\t\t");
    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)=='[=10=]') 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 returns 指针指向字符串中第一次出现的字符。 locptr 不需要 malloc/free。

详情:strchr

BR, 亚历克斯