首页 > 解决方案 > 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);
} 

标签: c++

解决方案


您需要分配新的内存。

用户2717954已经建议使用素数向量,这是解决此问题的最佳方法。

如果你想使用数组,你可以更改int prime[A+1]int* prime = new int[A+1];. 然后delete [] prime;在函数结束时使用完它。

当我这样做时,程序不会出现段错误。您必须分配动态内存并在完成后清理,因为程序不知道要分配多少内存,因为A + 1在编译时不知道大小。

但是,向量当然会根据需要调整大小,因此您不必担心动态内存。


推荐阅读