分段错误访问循环变量

时间:2016-11-11 19:00:35

标签: c++ segmentation-fault std

以下程序似乎导致循环变量出现分段错误。

有人可以帮我理解发生的事情!

std::vector<int> Euler::Utils::sieve(int n) {
std::vector<bool> A(n, true);
using size_t = std::vector<bool>::size_type ;
size_t size = static_cast<size_t>(std::sqrt(n));
std::vector<int> result;

for (size_t i = 2; i < size; i++) {
    if (A[i]) {
        size_t i2 = static_cast<size_t>(std::pow(i, 2));
        for (int j = 0; j < n; j++ ) {
            A[i2 + j* i] = false;
        }
    }
}
for (size_t i = 2; i < A.size(); i++) {
    if (A[i]) {
       //Seg fault here.
        std::cout << i << std::endl;
        result.push_back(i);
    }
}

return result;

}

编辑:错误在result.push_back(i);

的末尾

1 个答案:

答案 0 :(得分:0)

从快速浏览一下,我发现向量A的大小为n。但是在第一个嵌套的for循环中,数组A被编入{i2 + j*i}的索引。此表达式可以评估为大于n的数字,j0n-1。因此,{i2 + j*i}可能超出向量的容量,这可能导致seg错误。完整的代码将帮助我们验证这一点。