使用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
相关产品推荐
相关产品推荐

