-1

这是我的代码:当我的数组输入输入为 10001 时。然后它也进入输入 [1]=0 的 else 块,因为我已经将条件放在外部 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;
}
4

2 回答 2

1

那是因为您正在检查超出数组边界末尾的值,并使用不确定的值测试内存。

您的数组定义为

unsigned int input[1000];

该声明

if(input[j]==1)

当 j 为 10001 时,测试超出数组边界末尾的内存方式。该内存的价值是不确定的,实际上取决于许多因素。那个内存地址的值是 1 是非常不可能的(事实上,如果内存是真正随机初始化的,机会是 2^32 中的 1)。

于 2012-08-04T17:22:21.080 回答
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");
        }
    }
  }
于 2012-08-04T19:16:23.307 回答