某些测试用例中的C分段错误错误

时间:2017-05-18 14:17:09

标签: c scanf

无法理解为什么在某些特定的测试用例中它会返回分段错误而在其他测试用例上却被接受。请建议。

#include<stdio.h>
#include<math.h>
int main()
{
        int n,i,j,k,count=0,r;
        scanf("%i",&n);
        char string[500000];
        scanf("%s",&string[i]);
        int sqr[500000];
        sqr[0]=0;
        for(i=1;i<=n+1;i++)
        {
            sqr[i]=i*i;
        }
        for(i=0;i<n;i++)
        {
            for(r=1;r<=n+1;r++)
            {
                if((sqr[r]%(i+1))==0)
                {
                    k=(sqr[r]/(i+1))-1;
                    j=r-1;
                    int tempi = (int) string[i];
                    int tempj = (int) string[j];
                    int tempk = (int) string[k];
                    if(tempi==97 && tempj==98 && tempk==99) count++;
                }
            }
        }
        printf("%i",count);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

在您的代码中

 scanf("%s",&string[i]);

i具有不确定的价值。不能保证指针算术有效。它可以使指针指向任何位置,包括无效的内存。尝试访问该文件会导致undefined behavior

那说,一些一般的建议

  • int main()应该int main(void)符合托管环境。
  • 始终检查scanf()
  • 的返回值
  • 在扫描字符串时使用最大字段宽度以避免缓冲区溢出。
  • 将本地变量保留为自动存储,并为其添加显式初始化。