此代码中的分段错误在哪里?

时间:2012-06-04 05:51:18

标签: c++ segmentation-fault

你好我是一名业余程序员,为了让它变得更糟,我已经做了一段时间的编程,所以我决定用一些简单的Topcoder问题刷新我的记忆。我做的第一个最终是一个段故障,现在这超出了我能为自己找到的,任何人都可以帮助我理解段故障的来源。这是代码。

vector<int> Bonuses (vector<int> points)
{
    int totalPoints = 0;
    for (int i = 0; i != points.size(); ++i)
    {
        totalPoints += points[i];
    }

    vector<int> percentage;
    int percentageLeft = 100;
    int truncatedPercentage;

    for (int i = 0; i != points.size(); ++i)
    {
        truncatedPercentage = points[i]/totalPoints;
        percentage.push_back(truncatedPercentage);
        percentageLeft -= truncatedPercentage;
    }
    for (int i = 1;i <= percentageLeft; ++i)
    {
        percentage[percentage.size() - i] += 1;
    }
    return percentage;


}

3 个答案:

答案 0 :(得分:4)

您的程序中存在逻辑错误。改变这个:

truncatedPercentage = points[i]/totalPoints;

到此:

truncatedPercentage = points[i] * 100 / totalPoints;

否则百分比几乎总是0,而percentageLeft将是100.这就是为什么percentage[percentage.size() - i] += 1像AndersK在我之前找到的那样是segfaulting。该指数通常为负数。

那就是说,我不确定混合回击和直接赋值是否为您提供了最具可读性的代码。

答案 1 :(得分:3)

可能在这里

for (int i = 1;i <= percentageLeft; ++i)
{
    percentage[percentage.size() - i] += 1;
}

如果percentageLeft大于向量的大小。如果i超出了向量的大小,那么就比在内存位置之前读取导致访问冲突(segfault)。

答案 2 :(得分:1)

percentage[percentage.size() - i] += 1;
对于&#39;百分比&#39;

std::mapstd::vector更能满足您的目的。