[英]C segmentation fault: 11
#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
。 我知道它与数组有关。 怎么了
解决此错误的方法如下:
首先,添加#include <assert.h>
。 然后,无论何时从数组读取或分配给数组,都应首先测试是否在范围内建立索引。 例如,这一行:
memf[elxan]=vh;
应更改为以下几行:
assert(0 <= elxan && elxan < 10000);
memf[elxan]=vh;
这将帮助您查明错误。
您会注意到,通常在其他C程序中看不到这么多的asserts
。 没关系; 一旦习惯了编写C,您就会发现可以放心地使用其中的一些。 对于初学者,我认为您会发现它们非常有帮助。
我认为,即使假设输入的初始值是合理的,这个循环也几乎可以保证会消失并访问数组memf
之外的内存。
for(elxan=posit;elxan<=posit+vw;elxan=posit++) {
memf[elxan]=vh;
}
针对每次迭代测试posit+vw
,但每个迭代还增加posit
同时保持elxan
设置为posit
的前值,其中除病理值posit
和vw
被输入,保证让病情始终为真,循环将不在sizeof(memf)
迭代内终止。
一旦elxan
足够大,访问超出声明的数组大小的内存将引起麻烦。 通常,您已经调用了“未定义的行为”,在此之后几乎可以发生任何事情,但分段错误的具体症状与我们希望从超出数组范围最终看到的结果非常一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.