You need to enable JavaScript to run this app. C语言用char*搭配fscanf读TXT触发Segmentation fault: 11段错误
优惠活动
大模型
产品
解决方案
定价
更多

C语言用char*搭配fscanf读TXT触发Segmentation fault: 11段错误

问题核心成因
  • 触发Segmentation fault: 11的最直接原因是代码中定义的字符指针char *numIn是未初始化的野指针:仅定义了指针变量本身,没有为其分配任何可读写的合法内存空间,指针保存的是栈上的随机垃圾值,fscanf执行%s格式读取时,会尝试向这个随机指向的内存位置写入字符串内容,由于该内存区域通常属于系统保护范围,没有访问权限,就会直接触发内存访问违规,抛出段错误。
  • 代码存在的逻辑隐患会放大崩溃概率:文件打开失败的分支仅打印错误提示,没有终止程序流程,后续会拿着空的FILE指针调用fscanf、fclose接口,空指针操作本身就会触发段错误。
  • 潜在的安全风险:就算给指针分配了内存,fscanf的%s格式没有限制最大读取长度,如果待读取的单个字符串长度超过分配的缓冲区大小,会发生缓冲区溢出,破坏程序正常内存结构。
修复方案

对应问题逐点修正即可实现正常读取:

  1. 用固定大小的字符数组替代野指针,作为合法的字符串读写缓冲区,比如定义256长度的数组,足够存储普通文本中单个空白分隔的字符串内容。
  2. 文件打开失败时立即终止程序,避免后续空指针操作。
  3. 给fscanf的%s格式增加读取长度限制,匹配缓冲区大小,预留1个字节的空间存储字符串结束符\0,从根源避免缓冲区溢出。

修复后可正常运行的代码

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

int main() {
    FILE *spIn;
    // 定义合法的字符数组缓冲区,初始状态清零
    char numIn[256] = {0};

    spIn = fopen("data.txt", "r");
    if (spIn == NULL) {
        printf("Can't Open This File \n");
        // 打开失败直接退出,阻断后续空指针操作
        return 1;
    }

    // 限制最多读取255个字符,刚好匹配256长度的缓冲区
    while (fscanf(spIn, "%255s", numIn) == 1) {
        printf("%s\n", numIn);
    }

    fclose(spIn);
    return 0;
}

修复后运行效果为:逐次读取data.txt中所有被空格、换行、制表符等空白字符分隔的独立内容,将每个内容单独打印一行,覆盖所有整数、字符串类的文本token。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 06:06:05