C++memset()関数の詳細


転載:https://blog.csdn.net/lyj2014211626/article/details/65481630
 
memset関数は、メモリ領域を割り当てるためのメモリ付与関数です.
ヘッダファイル:cstringまたはmemory
ところでmemsetを使い始めたばかりの頃はmemsetがintごとに付与されていると思っていたので、memsetがあればforループで配列を初期化しなければならないと思っていました.しかし、memsetという関数の役割は、指定したメモリに数字を1バイトずつコピーすることです.
 
memset(dp,0,sizeof(dp));

intタイプの変数は一般的に4バイトを占有し、バイトごとに0を割り当てると「00000000 00000000 00000000」(10進数中の0)になります.
-1の値を付けると、「11111111 11111 11111 11111 11111」(10進数の-1)が入ります
 
memset(dp,1,sizeof(dp));

これにより、1を割り当てるとdp配列全体のintが1になると思っているかもしれませんが、そうではありません.
以上のコードを実行すると、dp配列の内容は1億1億1億1億1億1億1億1億1千万1から10進数に変換されて1になりません.
 
多くのプログラムでmemset(a,127,sizeof(a))が見られます.このようなコード、127は何の特別な数字ですか?127のバイナリ表現が01111111であることがベースのバイナリ変換で分かるように、dp配列に入れる内容は「01111111 01111111 01111111 01111111」である(10進数の2139062143)
 
これにより,配列内のすべての要素を大きな数に初期化する目的が実現され,最短経路問題や他の多くのアルゴリズムで必要とされる.
なお、intタイプの範囲は2^31−1(2147483647)であるため、intタイプを初期化する配列にも127という数値を用いることができる.
 
128なら?128のバイナリは1000000なので、その内容は1000000の1000000の1000000の1000000の1000000で、計算してこの数は-2139062144です.これで配列を小さな数に初期化できます.