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

如何获取字符串大小以传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:15:08