ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
(足りない桁や領域を)ゼロで埋めること。
たとえば、ハードディスクドライブにある機密データを完全に消去するために、そのデータのあったディスク領域に0を書きこむことなど。
プログラミングでも、バッファーをゼロで埋めるなどは良く行なわれる。
CやC++では、標準ライブラリ関数であるmemset関数を使ってゼロフィルするのが一般的である。
しかしmemset関数は引数が三つあり、しかもポインター渡しがあるため、よくバグが混入する。そこで、次のようなマクロを用意すると、バグ発生が未然に防げる。
#define ZEROFILL(var) memset(&(var), 0, sizeof(var))
これで、引数ひとつで中身は真っ白。次のように用いる。
struct sockaddr_in stSockAddr;
ZEROFILL(stSockAddr);
ポインターとして確保した領域のゼロフィルは、次のようにする。
struct tagHoge *pstHoge;
pstHoge = (struct tagHoge *)malloc(sizeof(struct tagHoge));
ZEROFILL(*pstHoge);
メモリーを0で埋めても、必ずしも値として0になるとは限らない。
int型など整数型は、殆どの環境で期待通りに動作する。char []などの文字列型の場合も、殆どの環境で問題なく、このため多くの場合、この方法がよく使われている。
しかしfloatやdoubleなど浮動小数点数の場合、メモリーを0で埋めても意図した結果にはならない。メモリーを初期化せずに使っているのと同じ現象が発生してしまう。
他に、ポインター型変数も、多くの環境では未使用時(NULL)はアドレス0を指すため問題はないが、プロセッサーによっては全く違うアドレスを指すのが標準となっていることがあり、この場合は動作に問題が生じる可能性がある。
また、bool型など、数でないような変数型も、どのような動作になるか想定できなくなる。
つまり、色々な型が収まった構造体などをインスタンス化したあと、memsetで0クリアして使うというのは、本来は正しくない。動いていたとしても、それはたまたま動いていたに過ぎないいのである。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます