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

标签 c

我不明白为什么 array 初始化为零后 i 立即设置为 0

程序工作正常,因为我已经重新初始化 k 的值i。 但是我找不到为什么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;
}

最佳答案

你有缓冲区溢出;由于缓冲区在堆栈上,它可能被视为堆栈溢出的一种形式

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]));
    ...
}

关于无法理解为什么将变量 i 设置为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10895389/

相关文章:

C++ - 包括所有系统 header ?

c - 辨别值 255 是真实数据还是错误输出

c - Gradle undefined reference `WinMain@16' 错误

c - 将数组传递给函数并显示元素时出错?

c - 打印下划线字符来代替整数 0

c++ - 使用 Arduino 编写一个简单的按钮 LED 电路

c - C中的段错误,似乎无法找到原因

c - 无法在 win32 项目中包含 ntifs.h

C - 使用 lseek 向后移动文件中的指针

c - C 中的内存管理(分配)