如何获取字符串大小以传入fread()函数?sizeof实现失败求助
问题分析与解决方案
你的代码存在两个核心问题:
char *string仅声明了指针,未分配实际内存空间,直接调用fread会写入非法内存区域,触发未定义行为。sizeof(string)获取的是指针类型的字节大小(32位系统为4字节,64位系统为8字节),而非你需要的字符串缓冲区大小,完全无法匹配文件内容的存储需求。
修复方案
方案1:使用固定大小缓冲区
如果能预估文件内容的最大长度,可以直接声明固定大小的字符数组作为缓冲区:
#include <stdio.h> #include <stdlib.h> #define BUFFER_SIZE 1024 // 根据实际需求调整大小 int main() { char string[BUFFER_SIZE]; FILE *fptr; fptr = fopen("program4.txt","r"); if(fptr == NULL) { printf("Error!"); exit(1); } // 读取最多BUFFER_SIZE-1个字符,预留位置存字符串结束符 size_t read_len = fread(string, sizeof(char), BUFFER_SIZE - 1, fptr); string[read_len] = '\0'; // 手动添加结束符,避免printf输出乱码 printf("%s\n", string); fclose(fptr); return 0; }
方案2:先获取文件大小再动态分配内存
如果不确定文件大小,可以先定位到文件末尾获取尺寸,再分配对应内存:
#include <stdio.h> #include <stdlib.h> int main() { char *string; FILE *fptr; long file_size; fptr = fopen("program4.txt","r"); if(fptr == NULL) { printf("Error!"); exit(1); } // 获取文件大小 fseek(fptr, 0, SEEK_END); file_size = ftell(fptr); fseek(fptr, 0, SEEK_SET); // 回到文件开头 // 分配内存,额外多1字节存字符串结束符 string = (char*)malloc(file_size + 1); if(string == NULL) { printf("Memory allocation failed!"); fclose(fptr); exit(1); } // 读取全部内容 fread(string, sizeof(char), file_size, fptr); string[file_size] = '\0'; printf("%s\n", string); free(string); // 释放动态分配的内存 fclose(fptr); return 0; }
关键注意事项
- 无论哪种方案,都要手动添加
'\0'字符串结束符,因为fread不会自动添加,否则printf输出时会读取到内存中的垃圾数据。 - 动态分配的内存必须用
free释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

