今天在写素数的输出的一个小代码
void prime()
{
/*for(int i=0;i<=N;i++)
number[i]=1;*/
memset(number,1,sizeof(number));
number[1]=0;
int i,j;
for(i=2;i<=N;i++)
{
if(number[i]==1)
{
for(j=2;j*i<=N;j++)
number[j*i]=0;
}
}
for(i=1;i<=N;i++)
if(number[i]==1)
printf("%d ", i);
}
用这个程序,发现根本不能输出答案,非常奇怪,分析了逻辑发现都没有错误,然后用上面注释的那一小段for循环来跑,正确答案一下就出来了
难道是memset出问题了么?以前都是这么用的啊,怎么可能
于是带着疑问上网找了一下关于memset的使用方法,有一句话很重要:memset是按字节进行赋值的
于是懂了,因为int是四个字节,如果按这么来初始化的话,那么int的数据变成了00000001 00000001 00000001 00000001
所以转化成十进制数之后值应该为16843009
调试一下代码,看了一下number数组的值,发现每一个数都是16843009,问题解决
PS. 用了这么久的memset,今天才觉察到这个错误,或许以前肯定跑了很多次程序,而没有发觉错误出在这里面,看来以后用memset,我还是只用来清零好了
或者对char型等一个字节的类型来初始化值