我无法理解为什么i
在0
初始化为零后立即设置为array
。
该计划工作正常,因为我reinitialized
value of 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;
}
答案 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]的指针。
如果它们相同,你肯定会被覆盖。