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

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判断,导致死循环。

修复方案

  1. 放弃用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'; // 保证字符串合法
}
  1. 调整realloc的大小参数,额外加1字节存储结束符:
pkg_name = realloc(pkg_name, pkg_name_len + 1);
  1. 把存储fgetc返回值的变量c的类型改为int:
int c = fgetc(db);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:05