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

如何向malloc分配的字符串末尾追加字符并动态扩容文件读取缓冲区

动态缓冲区追加内存实现方案

核心思路是使用realloc函数按需扩展缓冲区容量,同时跟踪缓冲区的已用字节数和总容量,避免内存溢出和频繁扩容带来的性能损耗。

具体实现步骤

  • 定义三个核心变量跟踪缓冲区状态:
    • 缓冲区总容量capacity:初始设为你定义的bufferSize
    • 已写入缓冲区的有效字节数used:初始值为0
    • 单次read调用的返回值read_cnt:用于判断读取结果
  • 每次调用read时,传入的读取长度为capacity - used,仅读取当前缓冲区剩余空闲空间能容纳的字节数,避免越界
  • 每次读取完成后遍历本次新增的字节,检查是否存在目标字符.:
    • 找到.:直接终止循环,可在目标位置后补\0将缓冲区内容转为合法C字符串
    • 未找到.且缓冲区已被填满:调用realloc扩容,通常每次扩容为原容量的1.5~2倍,减少后续扩容次数
  • 注意realloc的安全用法:先用临时指针接收返回值,确认扩容成功后再赋值给原缓冲区指针,避免扩容失败导致原有内存泄漏

示例代码

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define INIT_BUFFER_SIZE 1024 // 初始缓冲区大小可自定义

int find_dot_in_file(int fd) {
    size_t capacity = INIT_BUFFER_SIZE;
    size_t used = 0;
    char *buffer = malloc(capacity * sizeof(char));
    if (buffer == NULL) {
        perror("malloc failed");
        return -1;
    }

    ssize_t read_cnt;
    while ((read_cnt = read(fd, buffer + used, capacity - used)) > 0) {
        // 遍历本次新读入的内容找'.'
        for (size_t i = used; i < used + read_cnt; i++) {
            if (buffer[i] == '.') {
                // 找到目标字符,按需处理,此处示例补\0后打印
                buffer[i + 1] = '\0';
                printf("找到'.',之前的内容为:%s\n", buffer);
                free(buffer);
                return 0;
            }
        }
        used += read_cnt;
        // 缓冲区已满,需要扩容
        if (used == capacity) {
            size_t new_capacity = capacity * 2; // 每次扩容为原来的2倍
            char *temp = realloc(buffer, new_capacity * sizeof(char));
            if (temp == NULL) {
                perror("realloc failed");
                free(buffer);
                return -1;
            }
            buffer = temp;
            capacity = new_capacity;
        }
    }

    // 读到文件尾未找到'.'
    if (read_cnt == 0) {
        printf("读取到文件结束仍未找到'.'\n");
    } else {
        perror("read failed");
    }
    free(buffer);
    return -1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:03