【发布时间】:2019-10-23 21:05:24
【问题描述】:
埃拉托色尼筛法: 当我使用代码 1 过滤素数时,我得到输入 16777214 的分段错误,而在代码 2 中它没有给出分段错误。分段错误是由于我定义 (bool prime) 和 (memset) 的前 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;
}
}
}
````
````
【问题讨论】:
-
变量“n”的数据类型是什么?
-
抱歉,我将变量“n”更改为“A”,两种情况下的数据类型都是 int。
-
通过访问未初始化的变量
A,两个片段都表现出未定义的行为。唯一的区别是这种未定义行为的表现方式。 -
你不能这样初始化数组
-
您的
memset不是设置布尔数组的有效方法。
标签: c++