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

C语言如何编写函数将字符追加到字符串 代码输出(null)如何修复

问题根因分析
  • 指针传值导致外部变量未更新
    C语言的函数参数是值传递,你当前的append_char函数入参为char *buffer,函数内部修改的只是指针的本地副本,外部传入的buf变量不会收到任何修改,始终保持初始的NULL值,这是打印结果为(null)的核心原因。
  • sizeof(buffer)用法错误
    buffer是指针类型,sizeof(buffer)获取的是指针本身的内存大小(64位系统下固定为8字节,32位为4字节),和指向的字符串实际长度完全无关,你用这个值计算扩容大小、定位写入位置的逻辑全部错误。
  • realloc潜在内存泄露风险
    直接把realloc返回值赋值给原指针,如果realloc分配失败返回NULL,会直接丢失原内存的地址,造成内存泄露。
修复方案

首先修改append_char函数的参数为二级指针,同时单独维护字符串的实际长度:

// 入参改为二级指针,才能修改外部的char*变量
void append_char(char **buffer, char c) {
    size_t cur_len = 0;
    if (*buffer != NULL) {
        // 获取原有字符串的实际长度
        cur_len = strlen(*buffer);
    }
    // 扩容:原有长度 + 1(新字符) + 1(预留结束符位置)
    char *new_buf = realloc(*buffer, cur_len + 2);
    if (new_buf == NULL) {
        fprintf(stderr, "Could not allocate memory to buffer\n");
        // 分配失败不修改原指针,避免内存泄露
        return;
    }
    *buffer = new_buf;
    // 写入新字符
    (*buffer)[cur_len] = c;
    // 自动补字符串结束符
    (*buffer)[cur_len + 1] = '\0';
}

对应修改调用方式,传入指针的地址即可:

char *buf = NULL;
append_char(&buf, 'a');
// 追加其他字符直接调用即可,无需额外加'\0',函数内部已自动处理
printf("buffer: %s\n", buf);
// 使用完记得释放内存避免泄露
free(buf);
buf = NULL;

运行后会正确输出buffer: a。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:39:03