c - codechef 中的运行时错误 (SIGSEGV)

标签 c segmentation-fault

我正在解决一个问题 https://www.codechef.com/problems/DCGAME/ 在这里面,我找不到运行时错误(SIGSEGV)背后的原因。在我的电脑上,输出很好。我知道这个错误的含义,但仍然无法找到我犯错误的地方。我的代码如下:

  #include <stdio.h>
  void calc(long long int arr1[],int n,long long int arr2[][n],long long int  game[],int m)
  {
 //printf("Pre process %d %d",n,m);
 int i,j;
 for(i=0;i<n;i++){game[arr1[i]]++;}
 for(i=1;i<n;i++)
 {
       for(j=0;j<=n-i-1;j++)
       {
           if(arr2[i-1][j]>arr1[i+j])
           arr2[i][j]=arr2[i-1][j];
           else
           arr2[i][j]=arr1[i+j];
           game[arr2[i][j]]++;
       }
   }
//for(i=0;i<=m;i++){printf(" %d ",game[i]);}
 }
  int main(){

  int n,m,i,count=0,k;
  char c,p;
  scanf("%d %d",&n,&m);
  long long int a[n],b[n][n],max=0;

  for(i=0;i<n;i++)
  {
   scanf("%lld",&a[i]);
   if(a[i]>max)max=a[i];
   b[0][i]=a[i];
  }
   long long int game[max+1];
   for(i=0;i<=max;i++)
   game[i]=0;
   calc(a,n,b,game,max);
   while(m--)
  {
   // printf("WHILE-M");
   c=getchar();

   //scanf("%c",&c);
    scanf("%c %d %c",&c,&k,&p);

        switch(c)
        {//printf("SWITCH");
            case '<':
            //printf("CASE <");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            for(i=1;i<k;i++)
            {if(game[i]>0)
            count+=game[i];
            }
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;
            case '>':
            //printf("CASE >");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            for(i=k+1;i<=max;i++)
            {if(game[i]>0)
            count+=game[i];
            }
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;

            case '=':
            //printf("CASE =");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            count+=game[k];
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;
        }


      }
      return 0;

     }

最佳答案

如果您的算法在其他方面是正确的(我没有检查)但是您的堆栈空间用完了,那么一个简短的解决方法是更改​​ long long int a[n],b[n][n],max=0;到:

long long int *a, (*b)[n], max = 0;
a = malloc(n * sizeof *a);
b = malloc(n * sizeof *b);

同时更改long long int game[max+1]; for(i=0;i<=max;i++) game[i]=0;到:

long long int *game = calloc(max+1, sizeof *game);

你还应该检查失败,例如if ( !a || !b ) exit(EXIT_FAILURE); .其余代码可以保持不变。

关于c - codechef 中的运行时错误 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051098/

相关文章:

c - 无需复制的 Windows 环形缓冲区

由于函数结构重复而导致的 c 段错误

c - 在 C 中使用子进程的 exec 命令执行 bin 程序

c++ - 为什么 gcc 4.7.0 在这段代码上给我一个段错误,而在线 ideone(gcc 4.5.1) 却没有?

c - 字符串比较的段错误

c - 访问二维数组时出现段错误

c - 带有省略号的函数会导致段错误

c - 尝试理解汇编代码中的调用过程

C:找到两个 3D vector 之间的角度

c++ - WinHttpOpen 泄漏内存