2016-04-17 71 views
-2

我試圖提交此代碼的問題在hackerearth上,我得到 這SIGSEGV Runtime error。我讀了關於這個錯誤,但我無法讓我的代碼工作。有人說這是由於無效的內存引用,數組或索引超出限制的動態初始化。SIGSEGV - 運行時錯誤

#include <stdio.h> 
    long long int f(long long int); 
    long long int gcd(long long int,long long int); 
    int main(){ 
     long long int n,q,i; 
     scanf("%lld",&n); 
     long long int a[n]; 
     for(i=1;i<=n;i++){ 
      scanf("%lld",&a[i]); 
     } 
     scanf("%lld",&q); 
     while(q--){ 
      char ch; 
      long long int x,y,sum=0; 
      scanf("%c%lld%lld",&ch,&x,&y); 
      if(ch == 'U'){ 
       a[x] = y; 
      } 
      else if(ch == 'C'){ 
       for(i=x;i<=y;i++){ 
        sum = (sum + f(a[i]))%1000000007; 
       } 
      } 
      printf("%lld\n",sum); 
     } 
     return 0; 
    } 
    long long int f(long long int t){ 
     long long int i; 
     long long int res; 
     for(i=1;i<=t;i++){ 
      res = (res + gcd(i,t))%1000000007; 
     } 
     return res; 
    } 
    long long int gcd(long long int x,long long int t){ 
     int i; 
     long long int divisor=1; 
     for(i=1;i<=x;i++){ 
      if(x%i == 0 && t%i == 0){ 
       divisor = i; 
      } 
     } 
     return divisor; 
    } 
+0

哪條線它segfaults? – fluter

+0

您正在填寫VLA,我們必須瞭解該計劃的輸入內容。 –

+0

但是是的,這個錯誤將是一個可能的原因 –

回答

1

一個明顯的錯誤:

long long int a[n]; 
    for(i=1;i<=n;i++){ // <-- will cause buffer overrun on last iteration 
     scanf("%lld", a[i]); // <-- need address of argument 

在循環中,您正在訪問a[i]這是一個緩衝區溢出i == n時的最後一次迭代。另外,你的scanf要求地址通過。

循環應該是:

long long int a[n]; 
     for(i=1;i<n;i++){ 
      scanf("%lld", &a[i]); 

或者,如果你真的想用假基於1陣列(我真的不建議這樣做,因爲我已經看到過很多次,其中有一個摘你會這樣做:

long long int a[n+1]; 
     for(i=1;i<=n;i++){ 
      scanf("%lld", &a[i]); 
+0

它應該可能是for(i = 0; i