[英]What could be the reason I am getting segmentation fault using code 1?
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;
}
}
}
````
````
假設在創建數組之前初始化了變量A
則在堆棧上分配了該數組的內存,並且由於堆棧的大小有限,為16777214字節分配內存可能會導致堆棧溢出,從而導致分段錯誤。
另一方面,向量是在堆上分配的,不會發生相同的問題。
PS:可變長度數組不是標准的C ++,GCC將它們實現為非標准擴展。
當任一陣列超出索引並且您正在訪問非法內存空間時,就會發生分段錯誤。
首先,不能以這種方式動態啟動數組。 你應該這樣嘗試
int *prime = new int[length];
其次,也許對於您的prime[n+1]
,您的輸入值超出了“ n”(int)的限制。 當您使用數據類型int
,它具有內存限制。 嘗試使用long int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.