2014-02-26 36 views
-1

的問題:http://www.codechef.com/FEB14/problems/TWODOGSSIGSEGV錯誤的詳細信息和拆卸步驟

我寫了下面的程序,但是,內聯法官codechef我收到SIGSEGV錯誤。我想知道具體哪些指令在我的程序中創建此錯誤,以便我嘗試刪除該錯誤。 這裏是代碼:

#include<iostream> 
using namespace std; 
int main() 
{ 
    int n,k; 
    cin>>n>>k; 
    int a[n]; 
    for(int i=0;i<n;i++) 
     cin>>a[i]; 
    int arr[n+1]; 
    for(int i=1;i<n+1;i++) 
     arr[i]=n+1; 
    for(int i=0;i<n;i++) 
    { 
     int p=min(i+1,n-i); 
     arr[a[i]]=min(arr[a[i]],p); 
    } 
    int time=n+1; 
    for(int i=0;i<n;i++) 
    { 
     int p=a[i]; 
     if(p!=k-p&&p<k) 
      time=min(time,max(arr[p],arr[k-p])); 
    } 
    if(time==n+1) 
     cout<<"-1"; 
    else 
     cout<<time; 
} 
+0

好了,你有什麼* *試過? –

+0

@MichaelFoukarakis isearched,發現由於壞的內存分配或可能由於錯誤的指針initialisations所引起SIGSEGV錯誤,但我想我的代碼是在這些方面是正確的。 – InsaynAsasin

+0

@MichaelFoukarakis然後我在該程序的在網上判斷順利,但沒有運行使用gcc編譯碼塊 – InsaynAsasin

回答

4

給定的樣本輸入2:

Sample Input 2: 
5 5 
2 4 9 2 5 

你不能做到這一點

arr[a[i]]=min(arr[a[i]],p); 

因爲當i == 2arr[a[i]]將被評估爲arr[9],這是出你不擁有的內存和結果的修改,也就是未定義的行爲。這是你的程序失敗的地方。

0

你最好有一個更容易的時間,如果你的標識符是更有意義的。那麼說:

cin>>a[i]; 
.... 
arr[a[i]]=min(arr[a[i]],p); 

您正在索引用戶輸入arr []。如果你得到一個段錯誤,所以最好放在斷言針對這些情況,以防假設是無效的,是這樣的:

assert(a[i] < n-1); 

下一頁:

time=min(time,max(arr[p],arr[k-p])); 
再次

,索引陣列基於用戶輸入。添加另一個斷言來測試arr [p]和arr [k-p]是否有效。

最後,對於這一行:

if(p!=k-p&&p<k) 

您是不是要找:

if(p!=k-p&&p<n) 

一個基於n的分配,不是k。

0

如果你仔細閱讀這個問題,

the element in a[i] <= 10^6 . 

您已經聲明改編大小爲n + 1的陣列。

Constraint on n : n <= 500000 

此外,您正在嘗試訪問arr [a [i]],這可能會超出數組arr的限制。

 a[i] may be greater than 5 * 10^5 . 

這是導致分段錯誤的錯誤。