単純に0埋めをしたいのであれば、他の皆さんが示すとおり、NULLではなく単純に0または'\0'を使うべきです。ですが、それ以外でも問題があるコードになっていますので、そこについて述べさせていただきます。(つまり、ただの蛇足です)
###ほとんどの環境においてNULLは((void *)0)であり、整数値の0と同じとは限りません。
C言語では0というリテラルがポインタとして解釈されるときはヌルポインタとすると定義されています。ヌルポインタは値が0のポインタという意味では無く、どこもさしていないことが保証されたポインタという意味です。そして、マクロ定数NULLが先ほどのヌルポインタになるようにマクロを定義するとしています。そのため、gccではNULLは((void *)0)としています(あくまでgccの場合であり、他のコンパイラも同じであるという保証はありません)。
注意すべきはヌルポインタはリテラルが0なだけで、実際のデータが全て0であるとは限らないと言うことです。(int)NULLつまり(int)((void *)0)が、(int)0と同じになる保証はありません。
そして、今回は、memsetがバイト単位で書き込むと言うことがもっと意味不明なコードにしてしまっています。もし、NULLのメモリ上の実際のデータが[0x12 0x34 0x56 0x78]なら、リトルエンディアンの環境では[0x12 0x12 0x12 0x12]と書き込まれていくことになります。これはきっと、期待している動作では決して無いでしょう。
つまり、ヌルポインタで埋めたいという状況であっても、memsetの第2引数にNULLを使うこと自体が間違っています。
※ NULLの読み方にはナル派(英語かぶれ)とヌル派(独語かぶれ)の二つの派閥があります。
※ NULLとは違い'\0'は実際のメモリ上のデータが0であることを表しています。
参考:
[迷信] とりあえず memset で初期化 | 株式会社きじねこ
C言語の基礎知識(?)メモ(Hishidama's C Memo)#NULL
###void *型をキャストするときはintptr_tまたはuintptr_tを使うべきです。
void *のサイズがlongで収まるという保証はありません(事実、Windowsのx86_64環境では収まりません)。intで足りないから安直にlongとしてはいけません。ポインタのサイズが必ず収まるという整数型としてintptr_tとuintptr_tが用意されています。ポインタを整数として扱いたい場合は、こちらを使うべきです。
※ intptr_t等が使えないC90で書く必要がある場合は、プリプロセッサで分岐するなどの工夫をする必要があります。
2016/06/07 11:51
2016/06/07 21:41 編集
2016/06/07 23:08
2016/06/08 05:24