2014-03-31 116 views
0
#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。我知道它与数组有关。什么是错误?C分段错误:11

+0

你的测试值是什么? – fritzone

+0

您确定您为vw输入的值是否小于10000?你能告诉我们你输入的数据吗? –

+1

找到这样的错误的三种有用的方法是1)用调试器遍历代码2)添加'printf'语句来监视程序正在使用的值,3)添加'assert'语句来处理事情,数组的末尾(这是我强烈怀疑在这种情况下的问题)。 – Edward

回答

2

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

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

每次迭代测试对posit+vw,但每个迭代还增加posit同时保持elxan设置为posit的前值,这除非positvw病理值输入,保证让病情总是如此,并且循环将不会在sizeof(memf)迭代中终止。

一旦elxan足够大,访问超出数组声明大小的内存将导致麻烦。虽然通常情况下,您已经调用了“未定义的行为”,在此之后几乎可以发生任何事情,但分段错误的具体症状与我们期望最终从溢出数组边界看到的情况非常一致。

+0

你是对的!谢谢你的帮助 – user3482695

2

下面是如何处理这样的错误:

首先,添加#include <assert.h>。然后,无论您何时读取或分配给数组,都要首先测试您是否正在索引范围内。例如,该行:

memf[elxan]=vh; 

应改为这些行:

assert(0 <= elxan && elxan < 10000); 
memf[elxan]=vh; 

这将帮助你针点的误差。


你会注意到在其他C程序中你通常看不到这么多的asserts。没关系;一旦你习惯于写C,你会发现你可以放心地让它们中的一部分去。对于初学者,我认为你会发现他们非常有帮助。

+0

谢谢!确实非常有用! – user3482695