You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 17:06:01