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读取越界后的无效地址也会触发第二个报错。
修复方案
- 单独为输出文件名分配足够的内存,不要直接修改原输入文件名对应的内存块:
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和其他堆内存避免泄漏
- 额外补充边界判断:你当前代码没有判断
strrchr返回NULL的情况,如果输入的文件名没有.,extencao会是NULL,调用strcmp会直接崩溃,可以在扩展名判断前加一行校验:
if (extencao == NULL) { fprintf(stdout, "Extensão inválida!"); exit(EXIT_FAILURE); }
内容的提问来源于stack exchange,提问作者ongodhelpme
相关产品推荐
相关产品推荐

