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

生成素数时调用vector的push_back触发Segmentation fault问题求助

解决素数生成代码的Segmentation Fault问题

你的代码触发段错误的核心原因是整数溢出:当i的值超过sqrt(INT_MAX)(约46340)时,i*i会超出int类型的取值范围,变成负数。此时j = i*i作为bool_index的索引会越界访问数组内存,直接触发Segmentation Fault。

另外代码存在一个语法错误:main函数末尾的*/是多余的,需要删除才能正常编译。

修复后的代码

#include <bits/stdc++.h>
using namespace std;

vector<int> prime_list;

void generate_primes(int upper_limit){
    vector<bool> bool_index(upper_limit, true);
    // 初始化0和1为非素数
    if (upper_limit > 0) bool_index[0] = false;
    if (upper_limit > 1) bool_index[1] = false;
    
    for(int i = 2; i < upper_limit; i++){
        if (bool_index[i]){
            prime_list.push_back(i);
            // 用long long避免i*i溢出
            long long start = (long long)i * i;
            if (start >= upper_limit) continue; // 超过上限无需继续标记
            for(long long j = start; j < upper_limit; j += i){
                bool_index[j] = false;
            }
        }
    }
}

int main(){
    generate_primes(300000);
    for(int i : prime_list){
        cout << i << " ";
    }
    return 0;
}

额外优化建议

  • 替换vector<bool>为vector<char>:vector<bool>是C++标准库的特化容器,采用bit压缩存储,部分场景下访问效率较低,换成vector<char>可以避免潜在的容器特性问题。
  • 去掉全局变量prime_list:改为让generate_primes函数返回vector<int>,提升代码模块化程度,减少全局状态依赖。

内容的提问来源于stack exchange,提问作者Peco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:15:56