簡體   English   中英

下面程序中的分段錯誤

[英]Segmentation fault in below program

我試圖解決一個非常基本的問題SPOJ CANDY提交以下解決方案時遇到了分段錯誤。 但是在Visual Studio中可以正常工作。 我還考慮了大小(總和為long long int)來聲明變量,因為它可能很大

1)是否由於我在while循環中聲明了數組; 我應該在while循環之外聲明該數組,以便在每個測試用例中都使用同一數組

2)是否在每次運行循環(針對每個測試用例)時都創建新的數組,是否會導致垃圾回收,否則編譯器將在每個測試用例之后自動釋放內存(我知道在這種情況下我們必須釋放動態內存顯式地存儲)能否告訴我應該在哪個范圍內聲明變量?

我非常懷疑,因為分段錯誤與內存訪問有關。

   #include<iostream>
    using namespace std;



    int main(){

        while(1){
            int n;
            int arr[10001];
            cin>>n;
            if(n==-1)
                break;
            long long int sum=0;
            for(int i=0;i<n;i++){
                int temp;
                cin>>temp;
                sum+=temp;
                arr[i]=temp;

            }
             int mean=sum/n;
            if((sum%n)!=0){
                cout<<-1<<endl;
                continue;
                }
             int count1=0;
             for(int i=0;i<n;i++){
                if(arr[i]>mean){
                    count1+=(arr[i]-mean);

                }
             }
             cout<<count1<<endl;

        }

    }

您的問題可能是由於int arr[10001]的堆棧分配所致。 這很可能是40kB的分配。 現在,“分配”是一個錯誤的詞,因為它實際上只是通過執行類似int * arr = STACK_POINTER-40004來計算arr的地址。

不幸的是,通常默認情況下最大堆棧大小為12 kB。 這意味着操作系統將12 kB映射到內存並將STACK_POINTER設置到該內存的頂部(假設堆棧向下增長)。

因此,最終結果是您的arr指針現在指向已分配的堆棧之外-指向未分配的內存-並且第一次訪問會引發分段錯誤。 通常,您可以通過使用ulimit -s增加堆棧大小來解決此問題,但是您無法控制使用的判斷平台。

您有兩種選擇:

  • 使用堆分配代替int *arr = new int[10001] 這不受初始堆棧大小的影響。 在正常程序中,您應該注意清理該程序,但對於這樣的簡短程序,則沒有必要。
  • int arr[10001]的聲明移到頂層。 arr將指向一個稱為BSS部分的區域,該區域最初為零。 這也不受初始堆棧大小的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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