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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:11:06