一个关于memset使用的问题

今天在写素数的输出的一个小代码


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型等一个字节的类型来初始化值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值