9日目 メモリのセグメント化その5

おはようございます。

 今回はヒープについて(も)やりたいと思います。

ヒープというのは細かくは分かりませんが、

プログラムで制御できるメモリのセグメントらしいです。

 

C言語だとmalloc()というメモリ割り当て関数がありますね。使ったことないけどよく目にします。

ヒープセグメントのメモリは使用に先立ってこれを使う必要があります。

普通はポインタを使ってヒープ上のメモリにアクセスします。

 

今回は↓のプログラムを使っていきます。

f:id:simauma1203:20180119235532j:image 

 

変数は変数名のとおりです。

global(大域),static(静的),stack(スタック),initialized(初期化された)みたいな感じです。

18行目の(int*)malloc(4)ですが、これはヒープから4バイト割り当てるための文です。

malloc()はvoidのポインタを返すので整数のポインタにキャストしてます。

 

以下が実行結果です

 f:id:simauma1203:20180119235527j:image

 

ここでのポイントは初期化を行ってない変数、

static_varとglobal_varがbssセグメントに確保されるところです。

これは初期化をしてるglobal_initialized_var、static_initialized_varと比べれば確認できます。

(ちなみにbssセグメントは初期化を行ってない変数が確保されるところ、データセグメントは初期化を行った変数が確保されるところ)

 

bssセグメントはデータセグメントの直下にあるのでbssセグメントの方が少しだけ高位になってますね😀

 

heap_var_ptrはヒープを指すポインタです。

ヒープセグメントに確保されています。

ヒープセグメントはbssセグメントの直下にあります。

 

ちなみにヒープセグメントは動的なメモリ割り当てのためにサイズが非固定です。

 

あと局所変数stack_var(function内)とstack_var(main内)はスタックセグメントにあるのでそこそこ大きいアドレス値です。

 スタックセグメントはメモリの高位から低位に成長するのに対して、ヒープセグメントは低位から高位に成長します。

 

 今回は短いですがここまでです。

継続は力なりということで、これからも少しずつやっていきます。

あと観てくれた方ありがとうございます。

 

 

 

malloc()使ったことなかったのでメモ

http://www.wakhok.ac.jp/~kanayama/C/03/node152.html

わかりやすいサイト↑

char *s;

s=malloc(sizeof(char)*20);

こんな風にしてcharのサイズ*20分のメモリを確保できる

malloc()ってvoidのポインタ返すからキャストしなきゃいけないはずだけど、sizeof使ってるから使ってるからキャスト不要ということでいいんですかね(-_-) ←有識者の方ご教授お願いします

1/20/0:30追記

voidへのポインタは他の方との互換性があって相互代入可能ということを忘れてました。

教えてくださったMIKIさん(@mikiconfigさん)ありがとうございました