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
相关产品推荐
相关产品推荐

