生成素数时调用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
相关产品推荐
相关产品推荐

