広告
↓発売日:2018年09月22日↓
新品価格 |
今までのプログラムのメモリ確保は
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; }
「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; }
今度は「char」型のメモリを「256」個確保してみました。
今まで「char p[256]」のように確保していたものを「malloc()」関数で確保した感じです。
見た通り必要なメモリ数だけ掛け算してあげてるだけで他はほとんど変わりありませんね!
p = (char* )malloc(sizeof(char) * 256); if(p == NULL)exit(1);
今回は「sprintf()」関数を使って中身に文章を保存してみました。
これは「printf」の出力先をメモリにしたようなモノで
sprintf(用意したメモリのポインタ, "%s", "文章");
のように使います。
「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; }
最初にいくつ分メモリを確保するのか指定して、後にその確保するサイズの基準を指定します。
「malloc()」の反対になったみたいなものでほとんど同じですね!
ムダなメモリが出ないコンパクトなプログラムを書くには必須の技術なのでたくさん練習して身につけてしまいましょう!
それでは次回はビットレベルでの計算、論理演算(ろんりえんざん)について見ていきたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |