memset和memcpy使用教训

前两天在调试代码时,发现了一个比较低级的错误:对于memset和memcpy接口的参数错误使用。在这里总结一下,避免以后再犯。 先说一下我的错误教训。
  1. memset的使用,代码如下
?
1
2
3
4
5
INT16   i16ADBuf[4096];
 
...
memset (i16ADBuf, 6,  sizeof (i16ADBuf));
...
原意是想把数组的每个元素初始化成6,结果调试给出的元素值为1542,让我莫名奇妙,怎么都想不通,后来才发现自己的错误,你发现了吗? memcpy的使用,代码如下
?
1
2
3
4
5
6
7
INT16   i16ADBuf[4096];
INT16   g_i16ADBuf[4096];
 
int    pointNum = 205;
...
memcpy (g_i16ADBuf,i16ADBuf, pointNum);
...
目的是想拷贝已有的pointNum个元素到全局数组中去,结果却只拷贝了一半的元素到目的数组中,在整个应用中我有多处都犯了这个错误。 教训总结:
  1. C标准库中头文件中memset和memcpy的接口为:
?
1
2
3
4
5
6
7
#include <string.h>
 
//把buf中的前count个字符替换为ch,并返回buf。
void  * memset ( void  *buf,  int  ch,  size_t  count);
 
//把from中的count个字符拷贝到to中。并返回to
void  * memcpy ( void  *to,  const  void  *from,  size_t  count);
这两个函数都是字符串处理函数,它们的基本处理单元是字符,也就是字节,这就是我出错的原因,我想当然地以为它们的处理单元是我定义的基本数据类型,这也是受编码时的思维定势的影响。 为了实现我的目的,第一个使用memset是没法实现了,只能用循环进行赋值;第二个就是count参数需要乘以数据类型的字节数,这里是sizeof(INT16)。 PS:在编码的过程中,我发现很多人都会错误地使用各种函数接口,包括C标准库函数、unix系统调用等,这里包括那些有多年编码经验的老手。之前在调试代码时曾遇到过对C标准库中的文件读写函数的错误使用,包括参数使用错误和返回值使用错误。很多的错误是因为不小心或者编码过程中的想当然,这些在调试过程中也可以很容易地被排除掉,但是总归是要付出比在一开始就正确使用要更大的代价。我的教训是:手上随时备一份相关的参考手册,在开发中稍有疑虑时就查手册确保正确使用。

转载于:https://my.oschina.net/shelllife/blog/79893

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值