这是我的代码:当我对数组输入的输入是10001时。然后它也在输入[1] = 0的else块中输入,其中如果我将条件放在外部if if(input [j] == 1)。可以告诉我为什么会发生这种情况吗?
#include<stdio.h>
int main()
{
unsigned int tcase=0,build=0,i=0,j=0,k=0,count=0;
unsigned int input[1000];
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d",&build);
for(i=0;i<build;i++)
scanf("%d",&input[i]);
for(j=0;j<build;j++)
{
if(input[j]==1)
{
if(j==0)
{ input[j+1]=1;
printf("fddf");
}
else if(j==(build-1))
{
input[j-1]=1;
printf("Gfgf");
}
else
{
input[j+1]=1;
input[j-1]=1;
printf("awGfgf");
}
}
}
for(k=0;k<build;k++)
{
if(input[k]==0)
++count;
}
printf("%d\n",count);
}
return 0;
}
答案 0 :(得分:1)
这是因为您正在检查超出数组边界末尾的值,使用不确定的值测试内存。
您的数组定义为
unsigned int input[1000];
声明
if(input[j]==1)
当j为10001时,测试内存 way 超过数组边界的末尾。该记忆的价值是不确定的,实际上取决于许多因素。这个内存地址的值非常不可能是1(实际上,如果内存是真正随机初始化的,那么机会是2 ^ 32中的1)。
答案 1 :(得分:0)
我将根据您对Eric J的答案的评论回答您的问题:
J.no u got it wrong by i/p 10001 i mean for input[0]=1,input[1]=0 and so on... so it only occupies 5 array spaces
答案的要点是你输入的第一个输入为1,导致条件第一次成功。稍后在每次迭代中,您将不断更改输入数组的值,这会导致后续迭代进入条件。
如你所说,你的输入是
input[0] = 1
input[1] = 0
input[2] = 0
input[3] = 0
input[4] = 1
现在,请参阅以下代码中的行为:
for(j=0;j< build;j++)
{
if(input[j]==1) /* First for input[0], this condition succeeds */
{
if(j==0)
{
input[j+1]=1; /* This line changes input[1] to 1, so next time in the loop the condition if(input[j] == 1 will succeed */
printf("fddf");
}
else if(j==(build-1)) /* This condition will cause input[4] to be set to 1 and will cause if(input[j] == 1) to succeed for the last iteration of the loop */
{
input[j-1]=1;
printf("Gfgf");
}
else /** This condition will cause input[2] & input[3] to be set to 1 and will again cause if(input[j] == 1) to succeed in successive loop iterations **/
{
input[j+1]=1;
input[j-1]=1;
printf("awGfgf");
}
}
}