C语言使用dirent.h修改文件名时路径与文件名间出现异常符号
问题原因
malloc申请的内存空间是未初始化的,内存中残留的是随机的垃圾数据。strcat函数的逻辑是先在目标字符串中查找结束符\0,再从\0的位置开始追加内容。你直接对刚申请的fn调用strcat(fn, d_name),会从垃圾数据中随机找第一个\0的位置开始写内容,\0前面的垃圾数据就会保留在fn开头,最终拼接到路径中就出现了异常符号。第一次循环正常大概率是巧合,刚好申请到的内存第一个字节是\0,后续循环申请到的内存残留了之前的数据就出现问题。
修复方案
你可以任选以下任意一种方案修复:
- 把第一次拼接改成字符串拷贝
把strcat(fn, d_name);替换为strcpy(fn, d_name);,因为fn是新分配的空缓冲区,首次写入直接用拷贝即可,不需要追加。 - 初始化分配的内存
可以在malloc后加一行memset(fn, 0, 400 * sizeof(char));,或者直接把malloc换成calloc(400, sizeof(char)),calloc会自动把申请的内存全部初始化为0,保证strcat能从开头正确追加。 - 更简单的优化:无需动态分配内存
因为entry->d_name的最大长度是系统定义的NAME_MAX,直接在栈上开固定长度的缓冲区即可,不需要手动管理内存:
// 替换原来的malloc和strcat逻辑 char fn[NAME_MAX + 5]; // +5是留给后缀.enc和结束符 sprintf(fn, "%s.enc", d_name);
内容的提问来源于stack exchange,提问作者Shenladen
相关产品推荐
相关产品推荐

