使用memset出现的一个错误

今天在调试一个大数运算的程序时,出现了很诡异的事情:一些相对较小的数据运算是正确,而当数据到达一定位数的时候,运算结果中高位的某些位数据出现了错误。在进行单元测试的时候已经保证了此大数运算算法的正确性,所以错误肯定发生在别的地方。最后在调试中,终于发现错误出在了下面这条语句中:
memset(res,0,sizeof(res)/sizeof(res[0]));// clear the res buffer

我们先看一下库函数memset的用法:
void * memset ( void * ptr, int value, size_t num );
Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
Parameters
ptr
    Pointer to the block of memory to fill.
value
    Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
num
    Number of bytes to be set to the value.
Return Value
ptr is returned.
Example

res是一个可以存放150个int类型数据的数组。memset是把res空间的前n个字节设置为某一具体的数值。而在我的程序中,memset(res,0,sizeof(res)/sizeof(res[0]));实际上是把res空间的前sizeof(res)/sizeof(res[0])=数组中元素的个数个字节的设置为了0,然而按照程序的需求,正确的做法应该是将res数组全部设置为0,因此正确的代码应该是:

// clear the res buffer
memset(res,0,sizeof(res));// 注意:第三个参数是将res的首 n 个字节的值设为值 0,不是数组元素的个数sizeof(res)/sizeof(res[0])
所以上面诡异的情况其实就是因为res的高位字节没有被及时清空为0,所以才会出现错误。修改之后,程序结果正确。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值