画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語3 目次/十三日目 メモリ確保

広告

[C言語 入門 小学生でもわかるC言語3]
十三日目 メモリ確保

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

目次へ戻る

プログラム実行中のメモリ確保

今までのプログラムのメモリ確保は

int suji;
char moji;
int hairetu[20][20];

のように最初から大きさを決めて確保してました。

しかしこれだと配列の一つの要素しか仮に使われない場合も関係なく確保したメモリは変わらないので残りの部分が全てムダになってしまいます。

こんな時に自由にメモリを確保したり解放したりできれば便利ですよね。

そんなプログラム実行中でのメモリ確保についてみていきたいと思います。

メモリを一つだけ確保

/*十三日目 プログラム1*/
#include <stdio.h>
#include <stdlib.h>

int main(){
	int *suji_p;
	char *moji_p;

	suji_p = (int *)malloc(sizeof(int));
	if(suji_p == NULL)exit(1);

	moji_p = (char *)malloc(sizeof(char));
	if(moji_p == NULL)exit(1);

	*suji_p = 152;
	*moji_p = 'A';

	printf("suji_p = %d\n",*suji_p);
	printf("moji_p = %c\n",*moji_p);
	
	free(suji_p);
	free(moji_p);
	
	return 0;
}

■実行結果■

画像(ci_13_1)

「int」型と「char」型のメモリをそれぞれ一つだけ確保してみました。

メモリを確保する手順ですが、まず確保したい型のポインタ変数を用意します。

int *suji_p;
char *moji_p;

そして前まではこのポインタに何かしらの変数のアドレスを保存していたワケですが、今回は必要なメモリを「malloc()」という関数によって取得、その先頭アドレスをこのポインタ変数に保存します。

suji_p = (int *)malloc(sizeof(int));
if(suji_p == NULL)exit(1);

見た目難しそうですが、使い方はほとんど決まっているので難しく考えずこのカタチのままで覚えればよいかと思われます。

いちよう少し説明するとmalloc(必要なメモリのバイト数)で必要なメモリを確保します。

なので別にmalloc(1)のようにもできますが、普通は環境によって型の大きさが違う可能性があるので「sizeof()」を使って必要なメモリを指定します。

そしてそれを保存されるポインタ変数の型に合わせて型キャストします。

型キャストっていうのは一時的にその型に合わせる事でこの場合は先頭に(int *)とつける事で「int」型のポインタに合わせてという意味になります。

「char」型のポインタに合わせる場合は(char *)のようにします。

結果、確保したメモリのアドレスが返されるので、あとはそれを保存するだけです。

しかしながら、何かしらの事情でそのメモリが正常に確保できない場合があります。

その時はそのままプログラムを実行し続けると思わぬエラーにつながる恐れがあるので強制終了します。

if(suji_p == NULL)exit(1);

こちらの部分ですね。

説明がながながとしてしまいましたが、最初も言った通りカタチで覚えてしまいましょう。

そしてメモリを途中で解放したくなった時、

free(suji_p);
free(moji_p);

「free()」という関数を使って確保したメモリのポインタをそこに入れて解放します。

メモリを解放し忘れると思わぬバグの原因になったりするので必ず使い終わったメモリは解放するようにしましょう。

広告

複数のメモリを確保

確保できるメモリは一つだけではありません。

複数のメモリもまとめて確保する事ができます。

/*十三日目 プログラム2*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	char *p;
	p = (char *)malloc(sizeof(char) * 256);
	if(p == NULL)exit(1);

	sprintf(p, "%s", "hello world");
	printf("%s\n",p);
	free(p);
	
	return 0;
}

■実行結果■

画像(ci_13_2)

今度は「char」型のメモリを「256」個確保してみました。

今まで「char p[256]」のように確保していたものを「malloc()」関数で確保した感じです。

見た通り必要なメモリ数だけ掛け算してあげてるだけで他はほとんど変わりありませんね!

p = (char *)malloc(sizeof(char) * 256);
if(p == NULL)exit(1);

今回は「sprintf()」関数を使って中身に文章を保存してみました。

これは「printf」の出力先をメモリにしたようなモノで

sprintf(用意したメモリのポインタ, "%s", "文章");

のように使います。

calloc

「malloc()」によく似た関数で「calloc()」というのもあります。

/*十三日目 プログラム3*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	char *p;
	p = (char *)calloc(256,sizeof(char));
	if(p == NULL)exit(1);

	sprintf(p, "%s", "hello world");
	printf("%s\n",p);
	free(p);
	
	return 0;
}

■実行結果■

画像(ci_13_3)

最初にいくつ分メモリを確保するのか指定して、後にその確保するサイズの基準を指定します。

「malloc()」の反対になったみたいなものでほとんど同じですね!

ムダなメモリが出ないコンパクトなプログラムを書くには必須の技術なのでたくさん練習して身につけてしまいましょう!

それでは次回はビットレベルでの計算、論理演算(ろんりえんざん)について見ていきたいと思います。

次回

最終日 論理演算

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)