分段错误访问循环变量
Segmentation fault accessing loop variable
以下程序似乎导致了循环变量的分段错误。
谁能帮我理解这是怎么回事!
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);
的末尾
快速浏览一下,我发现向量 A
的大小为 n
。但是在第一个嵌套的 for 循环中,数组 A
在 {i2 + j*i}
上建立了索引。此表达式的计算结果可以大于 n
,因为 j
从 0
运行到 n-1
。因此,{i2 + j*i}
可能会超出向量的容量,这可能会导致段错误。完整代码将帮助我们验证这一点。
以下程序似乎导致了循环变量的分段错误。
谁能帮我理解这是怎么回事!
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);
的末尾快速浏览一下,我发现向量 A
的大小为 n
。但是在第一个嵌套的 for 循环中,数组 A
在 {i2 + j*i}
上建立了索引。此表达式的计算结果可以大于 n
,因为 j
从 0
运行到 n-1
。因此,{i2 + j*i}
可能会超出向量的容量,这可能会导致段错误。完整代码将帮助我们验证这一点。