使用代码1导致细分错误的原因可能是什么?

时间:2019-06-08 20:23:35

标签: c++

Eratosthenes方法筛: 虽然我使用代码1过滤素数,但输入16777214却出现分段错误,而在代码2中却没有分段错误。分段错误是由于代码1的前两行定义的(布尔素数)和(内存集)。我在https://www.interviewbit.com/problems/prime-sum/

上遇到此错误的原因可能是什么
//code 1:
vector<int> Solution::primesum(int A){
    bool prime[A+1];
    memset(prime, true, sizeof(prime));
    for (int p=2;p<=sqrt(A);p++){
        if(prime[p] == true){
            for (int i=p*p;i<=A;i+=p)
                prime[i] = false;
        }
    }
}
````
````

//code 2:
vector<int> Solution::primesum(int A){
    vector<bool> prime(A+1);
        for(int i=2;i<=sqrt(A);i++){
            if(prime[i]==false){
                for(int j=i*i;j<=A;j+=i)
                    prime[j] = true;
            }
        }
}
````
````

2 个答案:

答案 0 :(得分:0)

假定变量A在创建数组之前已初始化,则在堆栈上分配了该数组的内存,并且由于堆栈的大小有限,为16777214字节分配内存可能会导致堆栈溢出,从而导致堆栈溢出导致分段错误。

另一方面,向量是在堆上分配的,不会发生相同的问题。

P.S:可变长度数组不是标准的C ++,GCC将其实现为非标准扩展。

答案 1 :(得分:-1)

当任一数组超出索引并且您正在访问非法内存空间时,都会发生分段错误。

首先,不能以这种方式动态启动数组。您应该尝试这种方式,

int *prime = new int[length];

第二,也许是您的prime[n+1], 您的输入值超出了“ n”(int)的限制。当您使用数据类型int时,它具有内存限制。尝试使用long int