C++素数查找程序scope大于90时出现segmentation fault问题求助
C++素数查找程序段错误问题分析
核心问题原因
1. vector遍历删除逻辑错误
你在循环删除vector元素时提前缓存了删除前的数组长度,且删除操作后直接执行下标自增:
- 调用
erase方法删除元素后,vector的实际长度会自动缩小,仍用原缓存长度做循环判断会导致访问超出数组当前有效范围的位置 - 下标
i对应的元素被删除后,原i+1位置的元素会移动到i位置,直接i++会跳过该元素,导致筛素数的逻辑出现疏漏。
2. 数组下标越界访问(段错误直接诱因)
index自增后你直接执行n = arr[index],没有判断index是否在vector的有效下标范围内:
当scope取值大于90时,筛除过程中vector的元素减少速度快于index的增长速度,最终index会超出数组的有效下标范围,访问非法内存触发段错误。scope<=90时index刚好没有超出有效范围,因此没有触发崩溃。
修复方案
修改两处核心逻辑即可:
- 调整遍历删除的逻辑,删除元素时不自增下标,且每次循环都取vector当前的实际长度做判断
- 访问
arr[index]前先判断下标是否有效,无效则直接终止循环
修复后完整代码
#include <iostream> #include <vector> int main() { int scope = 200; std::vector<int> arr; int n = 2; for (int i = n; i < scope; i++) { arr.push_back(i); } int index = 0; while ((n * n) <= scope) { // 调整遍历删除逻辑,删除时不i++,动态判断数组长度 for (int i = index + 1; i < arr.size(); ) { if (arr[i] % n == 0) { arr.erase(arr.begin() + i); } else { i++; } } index += 1; // 增加下标有效性判断,避免越界 if (index >= arr.size()) { break; } n = arr[index]; } int final_size = (int)arr.size(); for (int i = 0; i < final_size; i++) { std::cout << arr[i] << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者Max Harbarth
相关产品推荐
相关产品推荐

