C语言实现tar提取功能调用fclose时报corrupted size错误
问题原因与修复方案
这个报错是典型的堆内存越界破坏导致的,你在readHeader函数里的内存分配逻辑存在多个错误,越界写了堆上的内存,直到调用fclose的时候libc检测到堆结构损坏才触发报错。
核心错误点
- 1. header数组内存分配大小错误
你调用readHeader时传入的nFiles初始值为0,函数内先从tar文件读取了实际的文件数nrFiles,但分配内存时用的还是未赋值的入参*nFiles(值为0),相当于申请了0长度的数组,后续循环给header[i]赋值时直接越界写堆,这是触发报错的直接原因。
修复:将内存分配行改为用实际读取到的nrFiles计算大小:
stHeaderEntry* header = malloc(sizeof(stHeaderEntry) * nrFiles);
- 2. 文件名内存分配逻辑错误
sizeof(str)取的是指针的大小(64位系统为8字节,32位为4字节),不是字符串的实际长度,会导致分配的内存不足以存下文件名,再次触发越界。另外strcpy自动会在结尾补\0,不需要额外调用strcat加终止符。
如果你的loadstr函数返回的是已经在堆上申请好的字符串,可以直接赋值不需要二次拷贝:
// 删掉原来的malloc、strcpy、strcat逻辑,直接写 header[i].name = str;
如果需要额外拷贝的话,正确写法是:
header[i].name = malloc(strlen(str) + 1); strcpy(header[i].name, str);
- 3. 读取size的变量类型不匹配
你定义的size是int类型,但fread读取的是unsigned int长度的内容,存在类型溢出风险,修复:
unsigned int size = 0; // 后续fread也保持一致 int n = fread(&size, sizeof(unsigned int), 1, tarFile);
- 4. 额外优化建议
打开tar文件时用二进制模式"rb"代替"r",避免不同系统下换行符转义导致读取的内容偏移。
内容的提问来源于stack exchange,提问作者StAincrad
相关产品推荐
相关产品推荐

