无法理解为什么变量i设置为零?

时间:2012-06-05 10:10:16

标签: c

我无法理解为什么i0初始化为零后立即设置为array

该计划工作正常,因为我reinitialized value of ki。 但我无法找出i成为0的原因。 为什么memset()正在清除数组,或者将数组设置为0

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
    long long int i = 123456789;
    long long int j = 987654321;
    long long int cnt = 0;
    int array[9] ;
    int xyz, k, x, rem, se;
    xyz = 0;

 //   printf("I = %llf", i);
    for (i; (i < j) && (cnt < 100000); i++)
    {
        k = i;
        x = 0;
        for (se = 0; se <= 9; se++)
        {
            array[se] = 0;
        }

/*************************************************/

        i = k;   // Here i becomes zero. Why?

/************************************************/

        //memset(array, 0, 9);   

        while(k != 0)
        {
            rem = k % 10;
            for(se = 0; se <= 9; se++)
            {
                if(rem == array[se])
                {
                    xyz = 1;
                    break;
                }

            }
            if(rem == array[se])
                {
                    xyz = 1;
                    break;
                }
            array[x++] = rem;
            k = k / 10;
        }
        if (xyz != 1)
        {
            cnt++;
        //    printf("Cnt = %d  ", cnt);
        //    printf("The value i is = %lld\n", i);
        //    Sleep(10);
        }
        xyz = 0;
        // printf("The value i is = %lld\n", i);
        // printf("Cnt = %d  \n", cnt);
        fflush(stdin);
    }
    printf("The value i is = %lld \n", i-1);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

你有一个缓冲区溢出;由于缓冲区位于堆栈上,因此可能被视为Stack Overflow 的一种形式。

int array[9];    // Elements array[0] .. array[8]
...

for (se = 0; se <= 9; se++)
{
    array[se] = 0;
}

必须是k被额外的0覆盖; i被指定为0,因为这是k中的值。当您在数组边界外写字时,可以调用“未定义的行为”,就像在此处所做的那样。未定义的行为意味着任何事情都可能发生并且没有问题。有时,它似乎有效;有时,会有意想不到的副作用。不惜一切代价避免“未定义的行为”。

惯用for循环是:

for (se = 0; se < 9; se++)
    array[se] = 0;

请注意<而不是<=

有些人不同意。请参阅评论。


您还询问{注释掉} memset()的电话:

//memset(array, 0, 9);

memset()的第三个参数是要设置的内存区域的大小(以字节为单位)。你在数组中总共(可能)36中设置了9个字节,这不太可能是你想要的。

这里,数组是在同一个函数中定义的,因此编写它是安全和明智的:

memset(array, 0, sizeof(array));

如果array是传递给函数的参数,那将无法正常工作;你需要一个不同的尺寸。例如:

void somefunc(int array[], int num)
{
    ...
    memset(array, 0, num * sizeof(array[0]));
    ...
}

答案 1 :(得分:2)

您正在覆盖数组的末尾。

int array[9] ;

for(se = 0; se <= 9; se++)
{
    array[se] = 0;
}

在C中,数组从0开始索引,因此循环向前迈进一步。惯用语法是:

for(se = 0; se < 9; se++)

换句话说,使用<将元素数量作为值。经常写,以删除可怕的数字常数,如:

for(se = 0; se < sizeof array / sizeof *array; se++)

这使用sizeof运算符自动(在编译时)计算适当数量的元素,这样如果更改array定义,则循环保持正确

答案 2 :(得分:1)

检查这一点的一种方法是通过打印&amp; x &amp; array [9] 来检查x和数组[9]的指针。

如果它们相同,你肯定会被覆盖。