C++Builder入門:変数2

第一章:基礎知識

6.変数2

6.1.メモリの確保

これまで、変数はint x;やchar c[]=”abc”;などとして宣言してきました。ここではわかりやすいのでchar型を例に説明をします。
これまでのchar c[]=”abc”;やchar c[256];としてメモリを確保する事を静的確保と言います。
静的確保は長さをあらかじめ決めてから宣言する方法です。
配列に文字列を連結する関数StrCatでは、コピー先のchar型の配列の長さは、連結後の長さ以上のメモリを確保しなければなりませんでした。先の例ではchar c[256];などとしてあらかじめこれ以上長くなることは無い。というサイズを指定してメモリを確保していました。しかし、これではメモリがもったいない上に、予期せぬ長さの文字列が来た場合エラーになってしまいます。
ここでは長さを利用するサイズだけ確保する動的確保を説明します。

6.2.動的確保 new と malloc

C++言語ではメモリの確保にnewとmallocという物を用いてメモリを確保することが出来ます。
newの方はC++言語で利用できる物で、mallocはC言語で利用できる物です。C++はCの上位互換なのでmallocも使えます。
何故C++には新たにnewが追加されたのかという話は、後述するクラスが関係しています。今は2種類の方法があるとだけ覚えておいてください。

int size=10;
char *c=new char[size];
ここに*cを利用したプログラムを書く
delete c;


char *d=(char*)malloc(size);
ここに*dを利用したプログラムを書く
free(d);

これがnewとmallocの使い方です。やっていることは全く同じ意味です。char c[10];と違うところは、サイズの指定に変数が使えると言うことです。char c[size];とは宣言できません。
動的に確保したメモリは、プログラマーが責任を持って解放しなければなりません。解放しないと使っていないのに使われたままになる、いわゆるメモリーリークという状態になってしまいます。静的確保では関数などのコードブロックが終了したり、プログラムを終了させた時に自動的に解放されますが、動的確保では、delete と free を用いて解放しなければなりません。
delete は new で確保したメモリを解放するための演算子で、freeはmallocなどで確保したメモリを解放する関数です。

char a[]="abcde";
char b[]="12345";
int size=StrLen(a)+StrLen(b)+1;
char *c=new char[size];
StrCopy(c,a);
StrCat(c,b);
Caption=c;
delete []c;

上の例では、StrLen関数を使い文字列a,bの長さを取得し、そのサイズでメモリを確保しています。+1してあるのはStrLen関数はNULL文字を含まない文字列の長さを返すので、NULL文字用のサイズを+1してあります。
このように、文字列の長さに合わせた適切な長さの配列を確保してやることが出来るようになります。
動的に確保した配列は、delete [] c;という形でメモリを解放します。配列では無い場合はdelete c;という書き方になります。

補足説明
malloc関数の頭に(char*)という物が付いています。これは、キャストという型変換の命令を与えています。この場合、malloc関数の戻り値が、void型のポインタで、これは型が決まっていませんという意味です。そこで、この場合、char型のポインタにする必要があるので、char*を先頭に付けています。しかしこのままでは、*が右側に付いているので、演算記号として認識してしまうので、括弧で囲うことで演算記号では無いという意味合いを持たせてあります。
キャストの例
char c=’a';
int i;
i=(int)c;
char型は実は文字型とは言っても中身に文字を格納しているわけでは無く、-128~127の数字を格納しています。なので、int型にキャストする事が出来ます。逆にint i=300;をchar型にキャストすると数値は44になります。
int i=300;
char c;
c=(char)i;
Caption=(int)c;
これは、char型が格納出来る範囲が最大256までという理由で、最大格納サイズより大きな数値が入ってくると、格納出来るように0~127を超えると-128に戻り、そこからさらにカウントして44になります。(300-256=44)
では何故char型が文字型と呼ばれているかというと、文字を表示するときパソコンは文字コード表という物を持っていて、あらかじめ決められた数字を指定の方法で送ると、その番号に割り当てられた文字を表示するという機能を持っています。char型は最低限のアルファベットと記号を表示するのに十分なサイズがあったので文字型として使われています。文字コード表には種類があり、Shift-JISやUTF8、Unicodeなどがあります。

カテゴリー: C++Builder, C++Builder入門   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>