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

C语言读取文件行存入array无输出,如何加入dynamically allocating逻辑

核心问题分析

你当前的代码没有输出的核心原因有2个:

  • 统计行数的循环执行完成后,文件指针已经移动到了文件末尾,后续读取文件内容的操作直接失败触发exit(1),程序提前终止
  • 固定大小的二维数组灵活性差,超出大小边界就会触发内存溢出,需要替换为动态分配逻辑

修复后的完整实现

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

int main(void)
{
    char buffer[1000] = {'\0'};
    int column, row, columns = 0, rows = 0;
    char **maze = NULL; // 动态分配的二维数组指针
    
    FILE* file = fopen("boards/0.txt", "r");
    if (file == NULL)
    {
        printf("There's no such file.\n");
        exit(1);
    }

    // 第一步:统计行数和列数
    while(fgets(buffer, sizeof(buffer), file) != NULL) {
        rows += 1;
        // 取最长行的长度作为列数(如果所有行长度一致取第一行也可以)
        int curr_len = strlen(buffer);
        if (buffer[curr_len - 1] == '\n') curr_len--; // 去掉换行符
        if (curr_len > columns) columns = curr_len;
    }

    // 第二步:重置文件指针到开头,准备读取内容
    rewind(file);

    // 第三步:动态分配二维数组内存
    maze = (char**)malloc(rows * sizeof(char*));
    for (row = 0; row < rows; row++) {
        maze[row] = (char*)malloc((columns + 1) * sizeof(char)); // 多留1位存结束符
    }

    // 第四步:读取文件内容到动态数组
    for (row = 0; row < rows; row++) {
        fgets(maze[row], columns + 2, file);
        // 去掉末尾的换行符
        int len = strlen(maze[row]);
        if (maze[row][len - 1] == '\n') {
            maze[row][len - 1] = '\0';
        }
    }

    fclose(file);

    // 输出内容
    for (row = 0; row < rows; row++) {
        printf("%s\n", maze[row]);
    }

    // 释放动态分配的内存
    for (row = 0; row < rows; row++) {
        free(maze[row]);
    }
    free(maze);

    return 0;
}

关键修改说明

  • 新增rewind(file)调用,将文件指针重置到开头,确保后续可以正常读取文件内容
  • 用二级指针char **maze替代固定大小的二维数组,先按行数分配一级指针空间,再逐行分配每一行的存储空间
  • 用fgets直接读取整行内容,替代逐个字符fscanf的写法,代码更简洁也降低出错概率
  • 新增内存释放逻辑,避免运行时内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:45:03