C语言使用strcat向数组追加字符出现间隔空格及realloc异常问题
问题根源
你遇到的现象是典型的C字符串操作不规范导致的未定义行为,核心问题有三个:
- 错误使用
strcat拼接单个字符:strcat要求传入的两个参数都必须是以\0结尾的合法C字符串,你传入单个字符变量的地址&c,该字符后面的内存是随机的,strcat会持续读取直到碰到随机出现的\0才停止,这些额外读取的垃圾字节就是你看到的字符间空白的来源。 realloc分配大小不足:C字符串需要额外1个字节存储结尾的\0,你现在realloc传入的actual_file_size仅统计了有效字符的数量,没有给结束符留空间,会导致字符串截断或后续内存访问越界。fgetc返回值类型使用错误:fgetc的返回值是int类型,目的是兼容EOF(值为-1)的判断,如果用char存储,当系统中char为无符号类型时,-1会被转为255,永远无法触发EOF判断,导致死循环。
修复方案
- 放弃用
strcat做单字符拼接,改用下标直接赋值的方式,每次写入字符后手动补结束符:
// 初始化时要给pkg_name分配初始内存,同时维护长度变量 size_t pkg_name_len = 0; // 每次读入字符后的逻辑替换为 if (is_pkg_name) { printf("Character being added to pkg_name: %c\n", c); pkg_name[pkg_name_len++] = c; pkg_name[pkg_name_len] = '\0'; // 保证字符串合法 }
- 调整
realloc的大小参数,额外加1字节存储结束符:
pkg_name = realloc(pkg_name, pkg_name_len + 1);
- 把存储
fgetc返回值的变量c的类型改为int:
int c = fgetc(db);
内容的提问来源于stack exchange,提问作者cobb208
相关产品推荐
相关产品推荐

