2016-04-17 3 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, основанные на (который я действительно не рекомендую это делать, так как я видел слишком много раз, где есть off- вы можете сделать это:

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

Вероятно, это должно быть 'for (i = 0; i

Смежные вопросы