运行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); }
额外说明
- 错误信息中的
rewind(fp=0x0),本质是文件指针f为NULL时,后续代码(或未展示的代码)尝试调用rewind操作空指针,修复文件打开失败后的处理逻辑即可解决。 - 你提到终端输出到
i=319,是因为文件打开失败后未终止函数,循环越界访问了仅分配32行的map数组,触发未定义行为导致计数异常。 - 无需重装C库,问题完全源于代码逻辑错误,与系统库无关。
内容的提问来源于stack exchange,提问作者yougs dnt
相关产品推荐
相关产品推荐

