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

