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

C语言调用strcat拼接文件名出现Invalid write of size错误怎么解决

问题原因
  • 第36行你给file_arg分配的内存大小仅刚好容纳输入的文件名(长度为strlen(argv[2])+1,仅够存原文件名字符和结尾的\0)
  • filename是strtok切割file_arg得到的指针,直接指向file_arg的内存区域,没有预留额外空间存储新的后缀.sol1
  • 第60行调用strcat(filename, extencao_out)时,会直接往filename指向的内存末尾追加内容,超出了原本分配的内存边界,触发valgrind的越界写入报错,后续fopen读取越界后的无效地址也会触发第二个报错。
修复方案
  1. 单独为输出文件名分配足够的内存,不要直接修改原输入文件名对应的内存块:
char extencao_out[] = ".sol1";
// 计算需要的内存大小:主文件名长度 + 后缀长度 + 结尾的\0占位
size_t out_name_len = strlen(filename) + strlen(extencao_out) + 1;
char* out_filename = (char*)calloc(1, out_name_len);
strcpy(out_filename, filename);
strcat(out_filename, extencao_out);
// 用新分配的输出文件名打开文件
FILE* file_out = fopen(out_filename, "w");
// 后续程序运行结束前记得free out_filename和其他堆内存避免泄漏
  1. 额外补充边界判断:你当前代码没有判断strrchr返回NULL的情况,如果输入的文件名没有.,extencao会是NULL,调用strcmp会直接崩溃,可以在扩展名判断前加一行校验:
if (extencao == NULL) {
    fprintf(stdout, "Extensão inválida!");
    exit(EXIT_FAILURE);
}

内容的提问来源于stack exchange,提问作者ongodhelpme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:07