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

使用getc()时read_scores函数出现EXC_BAD_ACCESS错误的解决求助

使用getc()时read_scores函数出现EXC_BAD_ACCESS错误的解决求助

嘿,刚看了你的代码,这个EXC_BAD_ACCESS错误大概率是这几个地方出问题了,我给你慢慢拆解:

1. 文件打开失败没做检查,直接操作空指针

你调用fopen(filename, "r")之后,没有判断fp是否成功打开。如果文件不存在、路径写错了或者没权限,fp会变成NULL,这时候调用getc(fp)就会直接触发内存访问错误——毕竟你不能对空指针做读写操作啊!

2. 变量c未初始化就用

你定义了char c;但没给初始值,直接就进while (c != EOF)循环了。这时候c是内存里的随机垃圾值,第一次循环的判断完全不可靠,虽然这不一定是直接崩溃的原因,但绝对是严重的bug。

3. 循环逻辑顺序搞反了

你现在的逻辑是先判断c是不是EOF,再读字符。正确的做法应该是先读字符,再判断是否为EOF,不然会漏掉最后一行的计数,而且结合上面未初始化的问题,循环一开始就可能出错。

给你修改后的代码参考:

List *read_scores(char *filename)
{
    FILE *fp;
    int c; // 注意这里改成int,因为EOF是int类型的!
    size_t lines = 0;
    int i = 0;
    int bufferLength = 255;
    char buffer[bufferLength];

    // 第一步:检查文件是否成功打开
    fp = fopen(filename, "r");
    if (fp == NULL) {
        // 可以在这里加个错误提示,比如perror("Failed to open file");
        return NULL; // 打开失败直接返回,避免后续错误
    }

    // 正确的计数逻辑:先读字符,再判断是否为EOF
    while ((c = getc(fp)) != EOF) {
        if (c == '\n') {
            lines++;
        }
    }

    rewind(fp);
    // 后面的逻辑你继续写就行
}

还有个小细节:c最好定义成int类型,因为getc()返回的是int——它会返回字符的ASCII值(转成unsigned char再转int),或者返回EOF(一个int类型的负数,通常是-1)。如果用char的话,万一你的系统里char是unsigned类型,那永远也判断不到EOF,循环会无限跑下去,也可能间接导致其他错误。

先试试这些修改,应该能解决你现在的崩溃问题~

备注:内容来源于stack exchange,提问作者zey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:35:30