10日目 メモリのセグメント化その6

おはようございます。さむいですね

メモリセグメントの勉強がこれでおわるので頑張ります。

 

今回はヒープの使用についてやります。

ヒープにメモリを確保するためにはmalloc()を使います。voidへのポインタ(先頭のポインタ)を返します。

これで確保したメモリはfree()で解放できます。

引数には解放するメモリの先頭アドレスを与えれます。

 

以下のプログラムでヒープの使用方法について見ていきます(長かったので切れてます許してw)

f:id:simauma1203:20180120183027j:image

f:id:simauma1203:20180120183034j:image

 

ヒープからargv[1]バイトを割り当て、char_ptrに代入。(デフォルトで50バイト)

ヒープから12バイト割り当て、int_ptrに代入。

char_ptrが指すメモリを解放。

ヒープから15バイト割り当て、char_ptrに代入。

int_ptrが指すメモリを解放。

char_ptrが指すメモリを解放。

という感じです。

 

コマンドライン引数なしの実行結果

 

f:id:simauma1203:20180120183104j:image

メモリがどんどん高位に割り当てられてますね。最初に割り当てた50バイト分は解放して後に再利用されてません。

 

でそれと比較するために引数ありでやってみます

 

コマンドライン引数に200を入れた場合

 

f:id:simauma1203:20180120183113j:image 

はい。この通り最初に200バイト確保して解放したメモリが再利用されてます。

因みに100だと再利用されませんでした。

200以上は再利用されました。

この基準はなんなんでしょう、ういーん。

 

要するに、巨大なメモリを割り当てて解放した後にメモリを割当てると解放したところが再利用されるということです。

 

 

次にエラー判定付きのmalloc()関数の紹介です。

これプログラム。

 

 

はい、さっきのプログラムと殆ど変わりません。

が、malloc()のエラー処理、一々書くのめんどいよね?

ということで関数にして楽に書けるようにしただけです

 

ちなみにプロトタイプ宣言と言うのは定義関数を呼び出す行より後ろの行目 に書いていい代わりに、呼び出す前の行で関数名と引数と返り値くらいは宣言しておきましょうというものです。

詳しいことは分かりませんがコンパイラのためらしいです。

 

これでメモリのセグメント化は終わりです。

長かった、、

 

次はファイルアクセスについてやります。

おやすみなせ✋