glibc致命错误排查:写入第四个字符时出现无效stdio句柄问题
错误原因分析与修复方案
你的代码触发glibc detected an invalid stdio handle错误,核心有两个问题:
1. 变量名与标准库函数重名
putc和getc是C标准库<stdio.h>里的内置函数,你把它们用来命名FILE指针变量,会导致符号冲突。当执行到fputc(c[3], putc)时,编译器会把putc解析成标准库函数而非你定义的文件指针,这就传递了非法的stdio句柄,直接触发glibc的错误提示。
2. scanf格式符使用错误
你用%s格式符读取单个字符,但%s是用来读取字符串的,它会自动在输入内容末尾追加\0结束符。比如输入字符x,scanf("%s", &c[i])会把x和\0写入内存,而&c[i]指向的是数组c的单个元素位置,这会直接越界覆盖数组后续内存,甚至破坏文件指针的结构,导致后续写入操作异常。
修复后的代码
#include <stdio.h> int main() { // 替换为不与标准库冲突的变量名 FILE* fp_write = fopen("test3.txt", "w"); if (fp_write == NULL) { return 1; } char c[4]; for (int i = 0; i < 4; i++) { printf("char: "); // 用%c读取单个字符,前面加空格跳过输入前的空白(如换行符) scanf(" %c", &c[i]); fputc(c[i], fp_write); } fclose(fp_write); FILE* fp_read = fopen("test3.txt", "r"); if (fp_read == NULL) { return 1; } char abc; while ((abc = fgetc(fp_read)) != EOF) { printf("%c", abc); } printf("\n"); fclose(fp_read); return 0; }
内容的提问来源于stack exchange,提问作者Nowhere coder
相关产品推荐
相关产品推荐

