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

运行C语言文件读取代码时触发__GI_rewind错误求助

问题分析与修复

你的代码存在多个关键逻辑问题,导致运行时崩溃和未定义行为,以下是具体问题点和修复方案:

核心问题

  • 文件打开失败后未终止函数:当fopen返回NULL时,仅打印提示却继续执行后续代码,此时对空指针f调用fgetc会触发未定义行为,这是你看到库函数错误的根本原因。
  • 内存分配类型错误:每行分配内存时使用sizeof(char *),但实际需要存储的是char类型数据,应改为sizeof(char)(显式写出更规范)。
  • 未处理换行符:fgetc会读取文件中的换行符(\n),如果你的map1.txt每行末尾有换行,会导致这些换行符被存入数组,占用mX的位置,打乱后续行的字符读取。
  • 缺失malloc返回值检查:如果内存分配失败,malloc会返回NULL,后续访问数组会直接崩溃。
  • 未处理文件内容不足的情况:当文件字符总数少于mY*mX时,fgetc持续返回EOF,但循环仍会执行,导致数组存入无效数据。

修复后的代码

#define LOADMAP_H
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>

const int mX = 46;
const int mY = 32;
float square_size_width = 3;
float square_size_height = 3;
char **map;

void loadmap()
// 从txt文件读取内容并加载到二维数组
{
    // 分配行指针数组
    map = malloc(sizeof(char *) * mY);
    if (map == NULL) {
        printf("内存分配失败(行指针)\n");
        return;
    }

    FILE *f = fopen("map1.txt", "r");
    if (f == NULL) {
        printf("文件打开失败\n");
        // 释放已分配内存避免泄漏
        free(map);
        map = NULL;
        return;
    }

    char c;
    int i, j;
    for (i = 0; i < mY; i++) {
        // 分配每行的char数组,使用sizeof(char)
        map[i] = malloc(sizeof(char) * mX);
        if (map[i] == NULL) {
            printf("内存分配失败(第%d行)\n", i);
            // 清理已分配的所有内存
            for (int k = 0; k < i; k++) {
                free(map[k]);
            }
            free(map);
            map = NULL;
            fclose(f);
            return;
        }

        for (j = 0; j < mX; ) {
            c = fgetc(f);
            // 遇到文件结束,终止执行
            if (c == EOF) {
                printf("文件内容不足\n");
                // 清理已分配内存
                for (int k = 0; k <= i; k++) {
                    free(map[k]);
                }
                free(map);
                map = NULL;
                fclose(f);
                return;
            }
            // 跳过换行符和回车符,只读取有效字符
            if (c != '\n' && c != '\r') {
                map[i][j] = c;
                printf("%c", map[i][j]);
                j++;
            }
        }
        printf(" | 行号:%d\n", i);
    }

    fclose(f);
}

额外说明

  1. 错误信息中的rewind(fp=0x0),本质是文件指针f为NULL时,后续代码(或未展示的代码)尝试调用rewind操作空指针,修复文件打开失败后的处理逻辑即可解决。
  2. 你提到终端输出到i=319,是因为文件打开失败后未终止函数,循环越界访问了仅分配32行的map数组,触发未定义行为导致计数异常。
  3. 无需重装C库,问题完全源于代码逻辑错误,与系统库无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:16:19