使用memset出现的一个错误
2010-06-01 01:05
363 查看
今天在调试一个大数运算的程序时,出现了很诡异的事情:一些相对较小的数据运算是正确,而当数据到达一定位数的时候,运算结果中高位的某些位数据出现了错误。在进行单元测试的时候已经保证了此大数运算算法的正确性,所以错误肯定发生在别的地方。最后在调试中,终于发现错误出在了下面这条语句中:
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,所以才会出现错误。修改之后,程序结果正确。
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
/* memset example */ #include <stdio.h> #include <string.h> int main () { char str[] = "almost every programmer should know memset!"; memset (str,'-',6); puts (str); return 0; } /* Output: ------ every programmer should know memset! */
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,所以才会出现错误。修改之后,程序结果正确。
相关文章推荐
- 使用postMan工具测试post请求出现400错误的一个坑,记录下!
- Django+sqlite使用时出现的一个错误的解决方法
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- [原]用c#做了一个桌面程序用来分离excel文件里的数据时出现“操作必须使用一个可更新的查询”错误的解决
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- 使用vs编译出现 ”error LNK1169: 找到一个或多个多重定义的符号“的错误
- 使用HBAdmin创建一个对象时出现java.lang.NoClassDefFoundError的错误
- 使用VS 2008(带sp1)编译VC 6.0的一个工程,出现下面的编译错误
- 使用验证控件出现错误:要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。”的解决办法。
- 在使用MyEclipse时出现的一个“cannot find a socket for the debugger”错误
- 问题: 在eclipse里使用ctr+shift+t打开一个类的时候,出现错误:Class file name must end with .class
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 【Z】oledb读写excel出现“操作必须使用一个可更新的查询”错误
- MySQL Connector/C++ 使用中出现的一个错误
- 使用JNI时,出现了一个错误:java.lang.UnsatisfiedLinkError : dlopen failed: library //dlopen打开失败
- asp.net中使用access数据源时出现至少一个参数没有被指定值的错误
- 连接Access数据库出现"操作必须使用一个可更新的查询"错误
- 一个链表在使用时出现内存错误的问题
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- 使用LinqDataSource出现“找不到与ViewState中存储的原始值中的给定键相匹配的行,请确保"keys"字典包含与上一个Select操作返回的行对应的唯一键值”错误的解决办法