我不明白为什么 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/