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

使用file_to_buffer函数将TXT文件传入缓冲区时未初始化问题求助

解决缓冲区未初始化问题:传值传引用的坑

你的猜测完全正确——问题就是C语言函数参数是传值传递,你传给file_to_buffer的buffer是main里指针变量的副本,函数里malloc赋值给这个副本,根本不会改变main里的buffer变量,所以main里的buffer还是未初始化的野指针,自然会报错。

要解决这个问题,需要把参数改成指针的指针,让函数能直接修改main里的指针变量,具体修改如下:

1. 修改函数参数和内部逻辑

把file_to_buffer的第二个参数改成char **buffer,这样函数就能拿到main里指针变量的地址,进而修改它的值:

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

void file_to_buffer(char *file_name, char **buffer)
{
    FILE *file = fopen(file_name, "r");
    if (!file) {
        printf("Failed to open %s\n", file_name);
        exit(1);
    }

    // 移动到文件末尾获取大小,同时检查fseek是否失败
    if (fseek(file, 0, SEEK_END) != 0) {
        printf("Failed to seek file %s\n", file_name);
        fclose(file);
        exit(1);
    }
    long tam = ftell(file); // 用long避免文件过大溢出int
    if (tam == -1) {
        printf("Failed to get file size of %s\n", file_name);
        fclose(file);
        exit(1);
    }
    fseek(file, 0, SEEK_SET);

    // 分配内存,注意+1存结束符
    *buffer = malloc(sizeof(char) * tam + 1);
    if (!*buffer) {
        printf("Failed to allocate memory\n");
        fclose(file);
        exit(1);
    }

    // 读取内容到缓冲区
    size_t read_size = fread(*buffer, 1, tam, file);
    // 手动添加字符串结束符,否则puts会读乱码
    (*buffer)[read_size] = '\0';

    fclose(file);
}

2. 修改main函数的调用

调用时要传buffer的地址,也就是&buffer:

int main()
{
    char file_name[100]; 
    char *buffer = NULL; // 初始化指针为NULL,避免野指针

    scanf("%s", file_name);

    file_to_buffer(file_name, &buffer);

    puts(buffer);

    free(buffer);
    buffer = NULL; // 释放后置空,避免悬空指针
    return 0;
}

额外注意点

  • ftell返回值是long类型,用int可能会因为文件过大溢出,所以改成long更安全。
  • fread不会自动添加字符串结束符'\0',必须手动加上,否则puts、printf这类字符串函数会读到内存里的垃圾数据。
  • 要检查fseek、ftell、malloc的返回值,避免错误传播。

内容的提问来源于stack exchange,提问作者João

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:01:09