memset和memcpy使用教训

限于喜欢 提交于 2020-11-14 11:59:00
前两天在调试代码时,发现了一个比较低级的错误:对于memset和memcpy接口的参数错误使用。在这里总结一下,避免以后再犯。 先说一下我的错误教训。
  1. memset的使用,代码如下
  2. ?
    1
    2
    3
    4
    5
    INT16   i16ADBuf[4096];
     
    ...
    memset (i16ADBuf, 6,  sizeof (i16ADBuf));
    ...
    原意是想把数组的每个元素初始化成6,结果调试给出的元素值为1542,让我莫名奇妙,怎么都想不通,后来才发现自己的错误,你发现了吗?
  3. memcpy的使用,代码如下
  4. ?
    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的接口为:
  2. ?
    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);
    这两个函数都是字符串处理函数,它们的基本处理单元是字符,也就是字节,这就是我出错的原因,我想当然地以为它们的处理单元是我定义的基本数据类型,这也是受编码时的思维定势的影响。
  3. 为了实现我的目的,第一个使用memset是没法实现了,只能用循环进行赋值;第二个就是count参数需要乘以数据类型的字节数,这里是sizeof(INT16)。
PS:在编码的过程中,我发现很多人都会错误地使用各种函数接口,包括C标准库函数、unix系统调用等,这里包括那些有多年编码经验的老手。之前在调试代码时曾遇到过对C标准库中的文件读写函数的错误使用,包括参数使用错误和返回值使用错误。很多的错误是因为不小心或者编码过程中的想当然,这些在调试过程中也可以很容易地被排除掉,但是总归是要付出比在一开始就正确使用要更大的代价。我的教训是:手上随时备一份相关的参考手册,在开发中稍有疑虑时就查手册确保正确使用。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!