C分段错误:11 #包括 int main() { char memf[10000]; int memlen、vn、vw、vh、fattime、posit、速度、间隔、nattacks、时间=0、qa=0、ninit=0、埃尔克斯; scanf(“%d\n”和&memlen); scanf(“%d\n”和&vn); 扫描频率(“%d%d%d%d%d%d%d%d%d”、&vw、&vh、&fattime、&Posite、&speed、&interval、&nattacks); 而(nattacks>ninit) { 如果(时间==fattime) { for(elxan=posit;elxanfattime) { 对于(qa=0;qa
,以下是如何处理此类错误: 首先,添加C分段错误:11 #包括 int main() { char memf[10000]; int memlen、vn、vw、vh、fattime、posit、速度、间隔、nattacks、时间=0、qa=0、ninit=0、埃尔克斯; scanf(“%d\n”和&memlen); scanf(“%d\n”和&vn); 扫描频率(“%d%d%d%d%d%d%d%d%d”、&vw、&vh、&fattime、&Posite、&speed、&interval、&nattacks); 而(nattacks>ninit) { 如果(时间==fattime) { for(elxan=posit;elxanfattime) { 对于(qa=0;qa,c,segmentation-fault,C,Segmentation Fault,,以下是如何处理此类错误: 首先,添加#包括。然后,无论何时从数组中读取或分配到数组,首先测试您是否在范围内编制索引。例如,此行: #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",&me
#包括。然后,无论何时从数组中读取或分配到数组,首先测试您是否在范围内编制索引。例如,此行:
#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;
}
应更改为以下行:
memf[elxan]=vh;
assert(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;
}
应更改为以下行:
memf[elxan]=vh;
assert(0我认为即使假设输入的初始值是合理的,这个循环几乎可以保证会跑掉并访问数组memf
之外的内存
assert(0 <= elxan && elxan < 10000);
memf[elxan]=vh;
for(elxan=posit;elxan我认为,即使假设输入的初始值是合理的,这个循环几乎可以保证会跑掉并访问数组之外的内存
assert(0 <= elxan && elxan < 10000);
memf[elxan]=vh;
for(elxan=posit;elxan您的测试值是什么?您确定为vw输入的值小于10000吗?您能告诉我们您输入的数据吗?查找类似错误的三种有用方法是1)使用调试器单步执行代码2)添加printf
语句以监视程序正在使用的值,以及3)添加assert
语句以捕获诸如从数组末尾寻址之类的内容(我强烈怀疑这就是本例中的问题所在)。显示完整的错误消息。您的测试值是什么?您确定为vw输入的值小于10000吗?您可以向我们显示您输入的数据吗?查找此类错误的三种有用方法是1)使用调试器单步执行代码2)添加printf
语句以监视程序正在使用的值,以及3)添加assert
语句以捕获诸如从数组末尾寻址之类的内容(我强烈怀疑这是本例中的问题)。显示完整的错误消息。