【C言語 memset】
配列のサイズと要素数は違う
~sizeの変数名は誤読しやすい~

最終更新日 2025年11月15日

warning: ‘memset’ used with length equal to number of elements without multiplication by element size

警告:memset()の第3引数には配列の要素数ではなくサイズを指定して下さい
[-Wmemset-elt-size]

■この記事の概要

C言語での配列操作では、要素数とサイズを混同するとエラーの原因になります。
この記事は、memsetの使用時に発生しがちな誤りと、変数名の工夫による誤読防止の方法を初心者向けにわかりやすく解説しています。


■配列のサイズと要素数を間違った例

#include    <string.h>
int main(void)
{
    //NG:要素数とサイズは違う
    int ary[1024];
    memset(ary,0,1024);

    //NG:sizeという変数名が誤解を与える
    size_t  size = sizeof(ary) / sizeof(ary[0]) ;
    memset(ary,0,size);             
}

memset()の第三引数に記述するのは要素数ではなくてサイズです。
配列の型がchar 型の時は要素数とサイズは同じで混同しがちですが
char 以外の時は配列要素数と配列サイズは別ものです。

又、9行目のように配列の要素数を求めた結果を
size という名前の変数名に代入すると
要素数なのかサイズなのかで混乱します。


■sizeof(配列の型)×要素数の掛け算は非推奨

//ダメな修正:型や要素数を間違う可能性がある
#include <string.h>
int main(void)
{
    int ary[1024];
    memset(ary,0,sizeof(int)*1024);

    size_t  size = sizeof(ary) / sizeof(ary[0]) ;
    memset(ary,0,sizeof(int)*size);
}

sizeof(配列の型)と要素数の掛け算は
型や要素数を間違える可能性が高いので
この修正は避けましょう。


■sizeof(配列の名)を推奨

//正しい修正:変数に対してsizeof()を使用する
#include <string.h>
int main(void)
{  
    int ary[1024];
    memset(ary,0,sizeof(ary));       
}

sizeof(配列の名)
こちらを推奨します。


参考:

sizeof()よりもsizeof(変数名)を使いましょう。

https://ttsuki.github.io/styleguide/cppguide.ja.html#sizeof

■アンケート

9
配列 int ary[1024]の全要素0クリアする最善の方法はどれですか?