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