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

Where is the Segmentation Fault in this code?

本文关键字:错误 在哪里 分段 代码      更新时间:2023-10-16

你好,我是一名业余程序员,更糟糕的是,我已经有一段时间没有做过任何编程了,所以我决定用一些简单的 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;

}

您的程序中存在逻辑错误。 更改此设置:

truncatedPercentage = points[i]/totalPoints;

对此:

truncatedPercentage = points[i] * 100 / totalPoints;

否则,百分比几乎总是为 0,percentageLeft为 100。 这就是为什么percentage[percentage.size() - i] += 1像安德斯克在我面前发现的那样偏格错误。 该指数通常为负数。

也就是说,我不确定混合回推和直接赋值是否会为您提供这里最易读的代码。

可能在这里

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

如果percentageLeft大于矢量的大小。如果i超过向量的大小,则在其内存位置之前读取,从而导致访问冲突(段错误)。

percentage[percentage.size() - i] += 1;

std::map会比std::vector"百分比"更符合您的目的。