動的にメモリを確保する(malloc)
malocとは
malocとは動的メモリを確保する関数です.
メモリ:画像や音楽データ,プログラムの変数などを保存するためにコンピュータが用意した保存領域のこと.
メモリの静的確保:変数や配列を宣言すると自動的にメモリ上に領域が確保される.このように自動でメモリを確保することを静的なメモリ確保 と言います.
メモリの動的確保:静的確保とは逆にプログラム上で必要に応じてメモリを確保し,不要になったら解放する方法のことを動的なメモリ確保と言います.
ヘッダファイル「stdlib.h」で宣言されており,引数で指定するバイト数分のメモリを確保し,確保したメモリ領域へのポインタを返します.
確保したメモリはfree関数で必ず解放する必要があります.
free():確保された動的メモリ領域を開放する関数
mallocの使い方について
配列や構造体のように要素数やメンバによって確保するメモリの量が異なる場合について,mallocを使ってメモリを確保する方法を説明します.
malloc関数を使用するにはヘッダファイル「stdlib.h」をインクルードする必要があります.mallocの引数にはsizeof関数を用いて構造体の型や配列の要素数を指定し必要なバイト数を入力します.これを構造体の型のポインタや配列のポインタでキャストして使用します.
※確保したメモリはfree関数を使って解放するのを忘れないように!!
キャスト(cast):変数の型を別の型に変換すること.
#include <stdio.h> #include <stdlib.h> // 構造体の宣言 typedef struct { int num; char *str; } strct; int main(void) { // ポインタ型の変数を生成 strct *entity; // 動的メモリの確保 entity = (strct*)malloc(sizeof(strct)); // メンバの初期化 entity->num = 0; entity->str = (char*)malloc(sizeof(char) * 32); // メモリに文字列を代入 sprintf(entity->str, "%s %s!", "Hello", "World"); printf("%s\n", entity->str); // メモリの解放 free(entity->str); free(entity); return 0; }
:実行結果
Hello World!
このサンプルコードではint型と文字列ポインタをメンバに持つstrct型の構造体を宣言しています。malloc関数を使ってstrct型のサイズのメモリを確保し、strct型ポインタにキャストしています。
また文字を入れるための「char型の領域」を32個分メモリ上へ確保し、文字列ポインタにキャストしています。sprintf関数を使って文字列ポインタに文字列を指定し、printf関数を使って文字列を表示しています。
最後にfree関数を使ってメンバの文字列ポインタと構造体の実体のメモリを解放しています。