实现素数查找函数时触发Segmentation Fault的原因排查
素数查找函数
primes_between段错误原因分析 核心问题:迭代器越界访问
你的代码中标记倍数的循环存在致命的越界问题:
for (auto itr = start+value-min; itr != end; itr += value) *itr = 1;
当value大于numbers向量的长度时,itr += value会直接跳到end之后的非法内存区域,访问*itr就会触发Segmentation Fault。举个实际场景:
- 若传入
min=5,max=6,numbers向量仅包含两个元素 - 遍历到
value=5时,itr初始指向第一个元素(start+5-5=start) - 执行
itr +=5后,itr会指向start+5,而end是start+2,此时itr已超出向量的合法内存范围,访问该位置直接触发段错误。
另外,范围for循环是基于初始的numbers向量元素遍历的,哪怕后续元素被修改为1,循环仍会遍历所有初始值(比如初始值为4的元素,哪怕已被标记为1,循环到value=4时还是会执行标记逻辑),这不仅会导致逻辑错误(把非素数加入结果),还会加剧迭代器越界的风险。
其他语法/逻辑问题
- 参数声明错误:
const int unsigned min不符合C++语法规范,正确写法应为const unsigned int min - 未处理
min > max的边界情况:此时numbers向量为空,后续操作可能引发异常 - 标记倍数逻辑不严谨:应该从
value的2倍开始标记,而非从value本身(当前代码先将素数加入结果再标记自身,暂时不影响结果,但逻辑存在漏洞)
修复思路示例
#include <iostream> #include <vector> std::vector<int> primes_between(const unsigned int min, const unsigned int max) { if (min > max) return {}; std::vector<int> numbers; for (unsigned int i = min; i <= max; ++i) { numbers.push_back(i); } std::vector<int> p_numbers; auto start = numbers.begin(); auto end = numbers.end(); for (auto it = start; it != end; ++it) { int value = *it; if (value != 1) { p_numbers.push_back(value); // 从value的下一个倍数开始标记,避免越界 auto mark_it = it + value; while (mark_it < end) { *mark_it = 1; mark_it += value; } } } return p_numbers; }
内容的提问来源于stack exchange,提问作者ดิศพัฒน์ นิรมิตพัฒนโกศล
相关产品推荐
相关产品推荐

