无法检测出分段错误的原因?

时间:2018-05-07 15:52:17

标签: c

#include<stdio.h>
int main()
{
  int t;
  scanf("%d",&t);
  while(t-->0)
  {
      long int size;
      scanf("%ld",&size);
      long int size2=size*size;
      long int a[size],b[size2];
      long int i=0;
      for(i=0;i<size;i++)
      {
          scanf("%ld",&a[i]);
      }
      long int j=0;
      long int y;
      y=2*a[0];
      for(i=0;i<size;i++)
      {
          for(j=0;j<size;j++)
          {
              if(i!=0 && j!=0)
              {
                b[i*size+j]=a[i]+a[j];
                y=y^b[i*size+j];
              }
          }
      }
      printf("%ld\n",y);
  }
}  

我正在解决一个流行的竞争编码网站上的一个问题,我写了这个代码,它适用于我尝试的大多数测试用例,但他们没有考虑它,因为它给了他们RE(SIGSEV) - &gt; (由于分段错误导致运行时错误。),甚至没有提供错误潜入的测试用例, 我确定了为不同类型的数据变量输入Input的语义(甚至确保我的代码保持在50000字节的允许限制内。)有人可以帮助我理解导致分段错误的原因吗?

1 个答案:

答案 0 :(得分:3)

这种分段错误是由于通过VLA(可变长度数组)分配过多的自动内存引起的。

  

我确保我的代码保持在允许的50000字节限制内

即使您的程序有足够的可用于动态分配的内存,大型VLA也可能导致未定义的行为,因为它们从自动存储器(通常称为“堆栈”)获取内存。程序可用的自动存储量通常只是流程可用内存总量的一小部分。

您可以通过切换到动态分配来解决此问题:

_