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

CS50 Plurality程序投票无效触发Segmentation fault问题求助

解决CS50 Plurality题目中的段错误问题

嘿,我看到你在做CS50的plurality编程题时遇到了段错误,咱们来揪出问题根源并解决它:

问题原因分析

你的段错误完全是因为vote函数的循环逻辑出了问题:
你在vote函数里用了for (int i = 0; i < MAX; i++)作为循环条件,但MAX是候选人的最大上限(9),而实际的候选人数量存在candidate_count变量里。当你投给一个不存在的候选人时,循环会遍历整个MAX长度的数组,而那些超过实际候选人数量的数组元素(比如i从candidate_count到MAX-1),它们的name字段根本没被初始化,是内存里的随机垃圾地址。这时候调用strcmp去访问这些无效地址,直接就触发了段错误。

另外还有个小问题:就算找到匹配的候选人,你的vote函数只是返回true,却没有给该候选人的票数加1,这会导致投票根本没被计数,虽然不是这次段错误的原因,但也是必须修复的逻辑漏洞。

修复后的vote函数

把循环上限改成实际的候选人数量candidate_count,同时加上票数递增的逻辑:

bool vote(string name) {
    for (int i = 0; i < candidate_count; i++) {
        if (strcmp(candidates[i].name, name) == 0) {
            candidates[i].votes++; // 给匹配的候选人加一票
            return true;
        }
    }
    return false;
}

验证修复效果

修改后,当你投给不存在的候选人时,循环只会遍历已初始化的候选人元素,不会碰那些无效的内存区域,strcmp也就不会触发段错误,程序会正常打印Invalid vote.;同时合法的投票也会正确计入候选人的票数里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:36:28