C/C++

C言語 メモリの確保と初期化の方法とは?初心者向けに,malloc,free関数を徹底解説

C/C++

はじめに

C言語では、動的メモリの確保と初期化を理解することが中級者になる上で非常に重要です。そこで今回は、動的メモリの確保と初期化を解説します。

4つのメモリ

まず、C言語においてメモリは、大きく分けて4つあるので、それを紹介します。

  1. プログラム領域:マシン語が格納される領域
  2. 静的領域:グローバル変数やstatic変数が格納される領域
  3. ヒープ領域:動的に確保されたメモリ領域
  4. スタック領域:ローカル変数などが置かれる領域

プログラム領域:マシン語が格納される領域

プログラム領域とは、 マシン語に翻訳(コンパイル)されたプログラムが格納される場所です。このプログラムが1行1行読み出されることにより、PCはプログラムを実行します。

静的領域:グローバル変数やstatic変数が格納される領域

静的変数に割り当てられるメモリー領域を指します。 割り当てが変化するスタック領域に対して静的領域と呼ばれプログラムの開始から終了まで変数の割り当ては変化しません。 静的変数ではmain関数実行前に初期化され、初期値の指定がない場合は0で初期化されます。

ヒープ領域:動的に確保されたメモリ領域

必要なタイミングでメモリを確保し、不必要になったタイミングで消去する必要のあるメモリです。

スタック領域:ローカル変数などが置かれる領域

メモリ上の、ローカル変数やメソッドの情報を格納する領域を指します。

ヒープ領域の利用方法

以下のコードを実行し、解説したいと思います。

コード

#include <stdio.h>
#include <stdlib.h>

#define SIZE    3

int main(int argc, char** argv) {
	int* p1 = NULL;
	double* p2 = NULL;
	int i;
	//  配列の生成
	p1 = (int*)malloc(sizeof(int) * SIZE);
	p2 = (double*)malloc(sizeof(double) * SIZE);
	//	確保されたメモリのアドレス
	printf("p1=0x%x p2=0x%x¥n", p1, p2);
	//  値の代入
	for (i = 0; i < SIZE; i++) {
		p1[i] = i;
		p2[i] = i / 10.0;
	}
	//  結果の出力
	for (i = 0; i < SIZE; i++) {
		printf("p1[%d]=%d  p2[%d]=%f¥n", i, p1[i], i, p2[i]);
	}
	//  メモリの開放
	free(p1);
	free(p2);
	return 0;
}

実行結果

p1=0x82c00020 p2=0x82c034b0¥np1[0]=0  p2[0]=0.000000¥np1[1]=1  p2[1]=0.100000¥np1[2]=2  p2[2]=0.200000

解説

  • malloc(マロック):ヒープ領域ないにメモリを確保する関数
  • free(フリー):メモリを消去する関数

malloc(マロック)の使い方

  • p1 = (int*)malloc(sizeof(int) * SIZE);

(型*)malloc(sizeof(型) * 大きさ)となります。malloc関数の先頭に代入するポインタ変数の型へのキャストをいれることが基本となります。

free関数による生成したメモリの初期化

ヒープ領域で確保したメモリは、消去する必要があります。

  • free(p);
月見
月見

メモリの初期化を忘れると、そのメモリ領域は、使用できないままとなります。プログラム終了後もメモリを占有することになります。この現象をメモリリークと言います。

まとめ

今回は、動的メモリの確保と初期化について解説しました。
動的メモリの確保領域をヒープ領域と呼び、以下で確保と消去が可能です。

  1. malloc:メモリの確保
  2. free:メモリの消去

メモリの消去を忘れると、メモリリークという問題が発生するので必ず消去する必要があります。

筆者がC言語の学習は以下の本がおすすめです。参考にしてみてください。

コメント

タイトルとURLをコピーしました