gpt4 book ai didi

c - *** 错误 `./prog5' : double free or corruption (out): 0x0000000001cc3260 *** Aborted (core dumped)

转载 作者:行者123 更新时间:2023-11-30 15:22:12 30 4
gpt4 key购买 nike

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

最佳答案

这个:

char *locptr=malloc(sizeof(char));
locptr=strchr(data,num);

是灾难的根源。您不应更改用作已分配内存句柄的指针值,因为释放内存时将使用该句柄。

在这里,您更改了地址,并实际上尝试释放内存中的另一部分,甚至可能是堆栈上的内存(取决于data 所在的位置)。

此外,您不应只为一个临时 char 分配内存。这就像要求租一平方英尺的公寓一样。您可能对如何使用指针有误解。您不必为每个指针分配内存。大多数指针都指向已经存在的东西,例如 strchr 的结果:它要么是 NULL,这意味着它不指向任何地方,要么它指向一个有效的值。搜索字符串内的 char。这里不需要分配。

因此,这个:

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 的实现来保证的。)

关于c - *** 错误 `./prog5' : double free or corruption (out): 0x0000000001cc3260 *** Aborted (core dumped),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287384/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com