LoT ラブオーティー

非モテ男の、非モテ男による、【女の子にモテたい】非モテ男のためIT活用ブログ

プログラミング

Cで見るメモリ領域のあれこれ!【text/data/bss/heap/stackセグメントとは?】

投稿日:



メモリ領域の勉強をしましょう。

プログラムを作るとメモリに格納されます。

○○セッションとかセグメントと言います。

主に以下の5つあります。

  • text もしくは code
  • data
  • bss
  • heap
  • stack



メモリアドレスと対応して、

このように配置されています。




以下に順を追って説明します。

テキストセグメント



コードセグメントとも言います。

低位(0x00000000)アドレスに

最も近い領域で、

オブジェクトファイルが保存される。

コード(命令)のみが格納されるだけで、

変数などのデータの実態は、

以降の領域に格納される。


データセグメント


static修飾された変数もしくは、

グローバル変数のなかで、

初期化済みの変数が格納される。



bssセグメント


block started by symbolの略。

データセグメントとややこしいが、

static修飾された変数もしくは、

グローバル変数のなかで、

初期化されてない変数が格納される。

初期化されてない変数の集まり領域なので、

プログラムローダによって、

実行時に0がセットされる。

ヒープセグメント


動的確保するときに使用される領域。

そのためメモリ上のヒープ領域は可変である。

例えば、ポインタで宣言して、

malloc関数を呼び出し際に、

指定したサイズはこの領域に確保される。

領域の確保は常に、

高位アドレスに向かって行われる。

要はプログラマが自由に

直接制御できる領域と言える。

スタックセグメント


初期化済みか否かを問わず、

ローカル変数が格納される。

ただしローカル変数をstatic修飾すれば、

データ or bssセグメントに

格納されることになる。

ヒープ領域同様に、可変である。

プッシュ&ポップなので、

常に低位アドレスに向かって、

確保されることになる。




以上が要点だけを抜き取った説明です。

イメージを掴みやすくするために、

実際にコードを見てみましょう。

 


ちなみにchar *cの宣言時点ではまだ、

メモリ上のアドレスはnull (nil)で、

実態が無い状態です。



最後まで読んでいただきありがとうございました。

-プログラミング

Copyright© LoT ラブオーティー , 2020 All Rights Reserved Powered by STINGER.