为什么它在外面进入else块时如果不是真的?

时间:2012-08-04 17:20:05

标签: c

这是我的代码:当我对数组输入的输入是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;
}

2 个答案:

答案 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");
        }
    }
  }