SIGSEGV - 运行时错误

问题描述:

我试图提交此代码的问题在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

但是是的,这个错误将是一个可能的原因 –

一个明显的错误:

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