【C言語】
memsetのよくある間違い

■1.memsetのよくある間違い

#include <string.h>
int main(void) {
    int ary[1024];
    struct {
        float   f;
        double  d;
    } buf;
    //1.[(warning)memsetZeroBytes]
    memset(ary,0x12,0);
    //2.[(portability)memsetFloat]    
    memset(ary,3.14,sizeof(ary));
    //3.[(warning)memsetValueOutOfRange]
    memset(ary,0x1234,sizeof(ary));
    //4.[(portability)memsetClassFloat] C++だけ    
    memset(&buf,0,sizeof(buf));
    //5.[(warning)incompleteArrayFill]
    memset(ary,0,1024);
    //6.[(warning)sizeofDivisionMemfunc]
    memset(ary,0,sizeof(ary)/sizeof(ary[0]));
}

■2.[(warning)memsetZeroBytes]

第3引数のサイズが0


■3.[(portability)memsetFloat]

第2引数に指定できるのはint型だが
実質unsigned char型
浮動小数点はint型に型変換される


■4.[(warning)memsetValueOutOfRange]

第2引数に指定できるのはint型だが
実質unsigned charで 0~0xFFまで

■5.[(portability)memsetClassFloat]

C++だけ
第1引数の指す先に浮動小数点メンバーがある。浮動小数点0.0の内部表現が0とは限らない

■6.[(warning)incompleteArrayFill]

第3引数は要素数ではなくてサイズ


■7.[(warning)sizeofDivisionMemfunc]

第3引数で要素数を求める割り算をしている