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;
}
}
}
````
````
答案 0 :(得分:0)
假定变量A
在创建数组之前已初始化,则在堆栈上分配了该数组的内存,并且由于堆栈的大小有限,为16777214字节分配内存可能会导致堆栈溢出,从而导致堆栈溢出导致分段错误。
另一方面,向量是在堆上分配的,不会发生相同的问题。
P.S:可变长度数组不是标准的C ++,GCC将其实现为非标准扩展。
答案 1 :(得分:-1)
当任一数组超出索引并且您正在访问非法内存空间时,都会发生分段错误。
首先,不能以这种方式动态启动数组。您应该尝试这种方式,
int *prime = new int[length];
第二,也许是您的prime[n+1]
,
您的输入值超出了“ n”(int)的限制。当您使用数据类型int
时,它具有内存限制。尝试使用long int
。