簡體   English   中英

使用代碼1導致細分錯誤的原因可能是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM