随机分段故障,没有任何非法访问

big*_*der 0 c linux gcc codeblocks segmentation-fault

当我使用终端命令编译并运行以下代码时(在linux mint sonya中)

gcc -o program program.c ./program

我遇到了分段错误.当我使用Code :: blocks IDE执行相同操作时,我不会收到任何错误.我知道访问非法内存时会出现分段错误.怎么了?

 #include <stdio.h>
    int main()
    {
    int t;
    scanf("%d",&t);
    for(t;t>0;t--)
        {
        int i,j,n,arr[n],sump=0,sums=0,total,ans;
        scanf("%d",&n);
        for(i=0;i<=n-1;i++) scanf("%d",&arr[i]);
        for(i=0;i<=n-1;i++,sump=0,sums=0)
                {
            for(j=0;j<=i;j++) sump=sump+arr[j];
            for(j=n-1;j>=i;j--) sums=sums+arr[j];
            if(i==0) ans=sump+sums;
            else if(ans>sump+sums) ans=sump+sums;
                }
        for(i=0;i<n;i++,sump=0,sums=0)
            {
            for(j=0;j<=i;j++) sump=sump+arr[j];
            for(j=n-1;j>=i;j--) sums=sums+arr[j];
                if(ans==sums+sump) break;
            }
        printf("%d\n",i+1);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Leo*_*ado 7

您在arr[n]没有初始化值的情况下 声明n.这是未定义的行为......

  • 纯粹的运气!这是未定义行为的本质 (4认同)
  • @bigcoder未定义的行为就是这样,它是未定义的.你可能会"幸运",它有时会奏效.其他时候,正如你刚刚经历的那样,事实并非如此.我把幸运放在引号中,因为当它工作时,那真的是_unlucky_.你认为一切都很好,突然你的代码在最不合适的时候崩溃,你不知道为什么.这是标记的c ++,但它是未定义行为的一个很好的例证:/sf/ask/450885291/#6445794 (2认同)