You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现素数查找函数时触发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,提问作者ดิศพัฒน์ นิรมิตพัฒนโกศล

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:47:10