#include <stdio.h>
int main()
{
    char memf[10000];
    int memlen, vn , vw,vh,fattime , posit , speed , interval , nattacks,time=0,qa=0,ninit=0,elxan;
    scanf("%d\n",&memlen);
    scanf("%d\n",&vn);
    scanf("%d %d %d %d %d %d %d",&vw,&vh,&fattime,&posit,&speed,&interval,&nattacks);

        while(nattacks>ninit)
        {
            if(time==fattime)
            {
                for(elxan=posit;elxan<=posit+vw;elxan=posit++)
                {
                    memf[elxan]=vh;
                }
                posit=posit+speed;
                time++;
                ninit++;

            }
            else if(time>fattime)
             {
                for(qa=0;qa<100000;qa++)
                {
                   if(ninit==nattacks)
                       break;
                   else if(qa%interval==0)
                   {
                       for(elxan=posit;elxan<=posit+vw;elxan=posit++)
                       {
                           memf[elxan]=vh;
                       }
                       posit=posit+speed;
                       time++;
                       ninit++;
                   }


                   else
                       posit=posit+speed;
                  }
             }
             else
             {  time++;
                posit=posit+speed;

             }
        }
    /*for(px=0;px<=memlen;px++)
    {
        if(memf[px]=='0')
            memf[px]=1;
    }*/



    printf("%s",memf);
    return 0;
}

我在执行这段代码时得到segmentation fault:11。我知道这和数组有关。怎么了?

最佳答案

我认为即使假设输入的初始值是合理的,这个循环也几乎可以保证运行并访问数组之外的内存。

for(elxan=posit;elxan<=posit+vw;elxan=posit++) {
    memf[elxan]=vh;
}

每次迭代都对memf进行测试,但是每次迭代也会增加posit+vw的值,同时保持posit设置为elxan的前一个值,除非输入了positposit的病理值,否则保证条件始终为真,并且循环不会在vw迭代内终止。
一旦sizeof(memf)足够大,访问数组声明大小之外的内存将导致问题。一般来说,您已经调用了“未定义的行为”,之后几乎可以发生任何事情,但分段错误的具体症状与我们期望的最终超出数组边界的情况非常一致。

关于c - C分割错误:11,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22771696/

10-09 13:35