2016-04-17 6 views
-2

私はハッカーの問題のためにこのコードを提出しようとしていましたが、私は を得ていますSIGSEGV Runtime errorです。私はこのエラーについて読んだが、私は自分のコードworking.Someを得ることができなかった無効なメモリ参照、配列の動的な初期化または範囲外の配列インデックスのために発生すると言う。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

どの行ですか? – fluter

+0

あなたはVLAを記入していますが、このプログラムへの入力は何かを調べる必要があります。 –

+0

しかし、そういうものが原因である可能性があります –

答えて

1

1つの明らかなエラー:バッファオーバーランi == nで、あなたはa[i]にアクセスしているループの最後の繰り返しで

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 

。また、scanfにはアドレスを渡す必要があります。

ループは次のようになります。

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

それとも、本当にオフがある場合、私は何回も見てきましたので、私は本当に、やってはお勧めしません、偽の1ベースのアレイを(使用したい場合コードのどこかに1つずつバグがある場合)、次のようにします:

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

おそらく 'for(i = 0; i