在C语言中如何将多个char字符拼接存入字符串buffer中?
C语言动态字符缓冲区追加字符实现方案
你给出的初始代码存在内存越界问题:仅申请了1字节的内存空间,写入buffer[1] = '\0'属于未定义行为,需要先修正初始化逻辑。
核心实现思路
- 额外维护两个变量:缓冲区当前已使用长度(不含终止符
\0)、缓冲区当前总分配容量 - 每次追加新字符前,判断剩余空间是否足够存储新字符+结尾终止符,不足则调用
realloc扩容,通常按当前容量的2倍扩容来降低内存分配开销 - 追加字符后补加终止符,保证缓冲区始终是合法的C字符串
完整可运行示例代码
#include <stdio.h> #include <stdlib.h> // 模拟你的read_next_char函数,可替换为实际的字符读取逻辑 char read_next_char() { // 示例:返回a-z测试字符,读取结束返回EOF static int cnt = 0; if (cnt < 26) return 'a' + cnt++; return EOF; } int main() { // 初始缓冲区配置 size_t buffer_cap = 8; // 初始容量可按需调整,减少扩容次数 size_t buffer_len = 1; // 初始已用长度,对应第一个字符'h' char *buffer = malloc(buffer_cap * sizeof(char)); if (buffer == NULL) { perror("malloc failed"); return 1; } buffer[0] = 'h'; buffer[buffer_len] = '\0'; char c; while ((c = read_next_char()) != EOF) { // 判断是否需要扩容:已用长度+1(新字符)+1(终止符) > 总容量 if (buffer_len + 2 > buffer_cap) { size_t new_cap = buffer_cap * 2; // 临时变量接收realloc返回值,避免分配失败丢失原buffer地址 char *temp = realloc(buffer, new_cap * sizeof(char)); if (temp == NULL) { perror("realloc failed"); free(buffer); return 1; } buffer = temp; buffer_cap = new_cap; } // 执行追加操作 buffer[buffer_len] = c; buffer_len++; buffer[buffer_len] = '\0'; // 补终止符保证字符串合法 } // 测试输出 printf("最终缓冲区内容:%s\n", buffer); // 使用完成后释放内存 free(buffer); return 0; }
注意事项
- 若你的lexer场景多处理中长字符串,可适当调高初始容量,进一步减少扩容触发次数
- 禁止直接将
realloc返回值赋值给原buffer指针,否则分配失败返回NULL时会丢失原内存地址,引发内存泄漏
内容的提问来源于stack exchange,提问作者user15307601
相关产品推荐
相关产品推荐

