gpt4 book ai didi

c - C中读取多个文件时"*** glibc detected *** ./a.out: realloc(): invalid next size:"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:25 43 4
gpt4 key购买 nike

我正在开发一个读取目录文件的应用程序,打开它们并将它们的内容复制到缓冲区中。单个文件的打开由单个函数执行,并返回指向读取输入的指针。但是,当我多次运行该函数时,即打开多个文件并读取其中的内容时,出现以下错误:

*** glibc detected *** ./a.out: realloc(): invalid next size: 0x096a9008 ***

这是我的源代码:

char *
readFile(char *filename)
{
int fp, numread, i;
char buffer[READ_SIZE], *content;

content = malloc(READ_SIZE);
fp = open(filename, O_RDONLY);
i=1;
for(;;){
printf("%d\n", i);
numread = read(fp,buffer,READ_SIZE);
if(numread == -1){
printf("error opening file\n");
exit(0);
}
if(numread < READ_SIZE){
buffer[numread] = '\0';
content = realloc(content, READ_SIZE*i+numread);
strcat(content, buffer);
break;
}
content = realloc(content, READ_SIZE*i);
if(content == NULL)
exit(0);
strcat(content, buffer);
i++;
}

close(fp);
return content;
}

读取两个文件后的输出如下所示:

1071
1072
1
2
*** glibc detected *** ./a.out: realloc(): invalid next size: 0x096a9008 ***

最佳答案

这里的问题是malloc 没有初始化它分配的内存。该内存的内容是不确定的,因此以任何方式使用它都会导致 undefined behavior .当您调用 strcat 时,您会在未初始化的情况下使用它。

要知道将第二个字符串添加到第一个字符串的何处,strcat 必须找到字符串终止符。但是这样做它必须读取您作为第一个参数传递的(未初始化的)内存,如果它没有找到终止符,它将继续读取超出您分配的内存限制,直到找到终止符。如果它发现终止符超出您分配的范围,它会将第二个字符串写入该位置,写入未分配的内存。

有两个明显的解决方案:要么改用calloc,要么将分配内存的第一个字节设置为字符串终止符。


正如 simonc 所指出的,您读入的缓冲区在所有情况下也不会终止。这里有两个问题:第一个是您没有终止字符串,第二个是您没有分配足够的内存来添加终止符。

关于c - C中读取多个文件时"*** glibc detected *** ./a.out: realloc(): invalid next size:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577765/

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