memset和memcpy使用教訓

前兩天在調試代碼時,發現了一個比較低級的錯誤:對於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標準庫中的文件讀寫函數的錯誤使用,包括參數使用錯誤和返回值使用錯誤。不少的錯誤是由於不當心或者編碼過程當中的想固然,這些在調試過程當中也能夠很容易地被排除掉,可是總歸是要付出比在一開始就正確使用要更大的代價。個人教訓是:手上隨時備一份相關的參考手冊,在開發中稍有疑慮時就查手冊確保正確使用。
相關文章
相關標籤/搜索