c++ - C++ 分段错误 (SIGSEGV)
问题描述
我有一个问题陈述。
给定一个偶数 A(大于 2),返回两个素数,其和等于给定数。
以下解决方案代码适用于所有中小型输入,但对于非常大的输入则失败16777214
。这是一个分段错误,我试图阅读这篇文章,但我无法弄清楚我的程序做错了什么,因为它适用于其他输入或者我应该在这里修复什么。我是 C++ 新手;
#include <iostream>
#include <vector>
using namespace std;
void form_sieve(int A, int* prime){
for(int c = 0; c < A; c++)
prime[c] = 1;
prime[0] = 0;
prime[1] = 0;
for(int p = 2; p * p <= A; p++){
if(prime[p] == 1){
// update all multiples of p
for(int i = p * p; i <= A; i += p)
prime[i] = 0;
}
}
}
void primesum(int A) {
// find prime numbers less than A
// use sieve method
int prime[A + 1];
form_sieve(A, prime);
vector<int> result;
// for(int c = 0; c <= A; c++)
// cout << prime[c] << "\n";
for(int i = 2; i <= A; i++){
if(prime[i]){
if(i + i == A){
result.push_back(i);
result.push_back(i);
break;
}
else if(prime[A - i]){
result.push_back(i);
result.push_back(A - i);
break;
}
}
}
// cout << result.size();
for(vector<int>::iterator ptr = result.begin(); ptr < result.end(); ptr++){
cout << *ptr << "\n";
}
// return result;
}
// Driver Code
int main()
{
primesum(16777214);
}
解决方案
您需要分配新的内存。
用户2717954已经建议使用素数向量,这是解决此问题的最佳方法。
如果你想使用数组,你可以更改int prime[A+1]
为int* prime = new int[A+1];
. 然后delete [] prime;
在函数结束时使用完它。
当我这样做时,程序不会出现段错误。您必须分配动态内存并在完成后清理,因为程序不知道要分配多少内存,因为A + 1
在编译时不知道大小。
但是,向量当然会根据需要调整大小,因此您不必担心动态内存。
推荐阅读
- sql - splitByChar 可空
- ios - 在不更改现有依赖项的情况下安装新的 Cocoapods?
- zend-framework - 从 ZF3 迁移到 Laminas 后,Laminas Dependency Plugin 可以移除吗?
- python - 下载大型 Gzip 文件并解压缩时出现内存错误
- android - Android工作室中的计步器
- python - 如何使用打印和格式为文本添加下划线
- reactjs - 如何从共享点在线 SPFx webpart 使用 Azure 认知搜索
- html - 需要一个带有页眉、页脚和左面板的仪表板基本模板
- swift - 适用于 Xcode 11.4 的 Apple Swift-Format 工具
- selenium - 在用户登录从属虚拟机之前,Jenkins 作业不会在从属上执行