2016-11-11 151 views
-1

以下程序似乎在循環變量上導致分段錯誤。分段錯誤訪問循環變量

任何人都可以幫助我瞭解發生了什麼事請!

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)所述端;

+0

請給我們足夠的代碼來重現問題。 –

+0

可能'A [i2 + j * i]'超出範圍? – Dani

+0

@Dani它不是。錯誤似乎發生在result.push_back(i) – JoyGreen

回答

0

乍一看,我看到矢量A的大小爲n。但在第一個嵌套for循環中,數組A{i2 + j*i}上索引。該表達式可以評估爲大於n的數字,因爲j0運行至n-1。因此,{i2 + j*i}可能會超過您的向量的容量,這可能會導致seg故障。完整的代碼將幫助我們驗證這一點。

+0

我不認爲這是問題,我只能去sqrt(n) – JoyGreen

+0

問題似乎是在result.push_back(i) – JoyGreen

+0

第二次看。你是對的。 A [i2 + j * i]是問題所在。我將for循環更新爲for(int j = 0; i2 + j * i JoyGreen