メモリとは?
コンピュータ内部で情報記憶を担当するICチップのことです。
8GB、16GB等製品によって記憶容量が異なります。
1つのマスに1バイトの情報を書き込むことができ、先頭を0として何番目の場所であるかを指定して情報を書き込みます。
どれくらいのマス目があるの?
16GBのメモリの場合は、約1600億個のマス目があります。
プログラムの記述におけるメモリの動作
記述 | メモリの挙動 |
---|---|
変数宣言 | メモリ領域を確保する。 |
変数に代入 | メモリ領域の値を書き込む。 |
変数から値を取得 | メモリから情報を読み出す。 |
メモリの各領域
領域名 | 説明 |
---|---|
スタック領域 | プログラム内の変数、配列、引数、戻り値等を格納する領域です。
「関数が使う一時的なデータ置き場」という意味合いがあり、小さな容量しか準備されないので、配列等は基本的には大きな容量を確保することができません。 |
ヒープ領域 | メモリ制御命令を使うときに利用される領域です。 |
静的領域 | 内容が変わらない定数、リテラル情報、staticがつけられた特殊変数を格納 |
メモリ関連関数
C言語では、メモリアクセスに関連したよく出る関数があります。
いずれも「#include<string.h>」という標準のヘッダファイルをインクルードする必要があります。
memcpy
配列等のメモリ領域を別のメモリ領域に丸々コピーすることができます。
構文
1 |
void* memcpy(void* コピー先アドレス,const void* コピー元アドレス,size_t コピーするバイト数); |
注意点
この関数は「浅いコピー(shallow copy)」をしているという点です。
構造体や、配列自体のアドレス領域は丸々コピーしますが、もし構造体や配列の中にポインタ型のメンバが含まれている場合は、含まれている構造自体はコピーをしません。
memcmp
メモリ領域同士が合致しているか比較することができます。
通常の配列では、「あるメモリ領域と別のメモリ領域を直接イコール演算子で比較」はできないので、それを実現したい場合はこれを使うことになります。
memset
メモリ領域を特定の情報(0等)で埋める(初期化する)ことができます。
配列等で使用するメモリ領域を言葉通り初期化したい場合に使います。
malloc
ヒープ領域に連続したメモリを確保します。
構文
1 |
void* malloc(サイズ); |
通常の配列であれば、メモリのスタック領域に入っているので、関数が終わると解放されて使えませんが、mallocを使うとヒープ領域に確保されるので自動開放されることはありません。
free関数を使って、プログラマがメモリを手動で解放してあげる必要があります。もし、解放しなければメモリリークが発生して、PC内のメモリを食いつぶしてしまいます。
free
mallocで確保したメモリ領域を手動で解放します。
構文
1 |
void free(void* 変数名); |
calloc
mallocに似ているが違う点としては、メモリを確保した直後に内容を0で埋めてしまう点。
malloc後にmemsetで0で初期化しているような処理があれば、こちらの方がスマートなので、こちらを使うようにしましょう。
この記事へのコメントはありません。