動的メモリ確保 - malloc()
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 32/63。
ここでは、プログラムの実行中にヒープからメモリを要求するための主要な関数である malloc() について学びます。malloc() 関数は「memory allocation(メモリ割り当て)」の略で、コンパイル時に固定サイズの変数を宣言するのではなく、必要な時にメモリを動的に割り当てることができます。
malloc() 関数は、割り当てたいバイト数という1つの引数を取ります。これは、割り当てられたメモリブロックへの voidポインタ を返します。割り当てに失敗した場合は NULL を返します。voidポインタを返すため、適切なデータ型にキャストする必要があります。
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 1つの整数分のメモリを確保する
// ptrは整数を格納可能なメモリ領域を指しています
malloc()の主な利点は柔軟性です。実行時に必要なメモリ量を正確に要求でき、このメモリは明示的に解放するまで利用可能なまま残ります。これは、プログラムが実行されるまでどれだけのメモリが必要かわからない場合に特に便利です。
malloc() を使用するには <stdlib.h> をインクルードすることを忘れずに、返された void ポインタは常に扱うデータ型に合わせてキャストしてください。
チャレンジ
簡単malloc() を使用してヒープ上に単一の整数を作成し、操作することで、動的メモリ割り当てを実演する C プログラムを作成してください。プログラムは以下を行う必要があります。
malloc()を使用して、1 つの整数用のメモリを動的に割り当てます- 返された void ポインタを整数ポインタにキャストします
- ユーザー入力から整数値を読み取ります
- デリファレンス演算子を使用して、入力値を動的に割り当てられたメモリに格納します
- 格納された値を次の形式で出力します:
Stored value: [value] - 同じメモリ位置に値の 2 乗を計算して格納します
- 2 乗された値を次の形式で出力します:
Squared value: [value]
malloc() を使用するために <stdlib.h> ヘッダーをインクルードすることを忘れないでください。プログラムは、ヒープからのメモリ要求、データの格納と操作、およびポインタ操作を通じた割り当て済みメモリの操作という、動的メモリ割り当ての基本的なワークフローを示す必要があります。
例えば、ユーザーが 7 と入力した場合、出力は次のようになります。
Stored value: 7
Squared value: 49このチャレンジでは、メモリがコンパイル時ではなく実行時に要求される動的メモリ割り当ての基本概念を紹介します。これにより、プログラムのメモリ使用の柔軟性が高まります。
チートシート
malloc() 関数は、プログラムの実行中にヒープからメモリを動的に割り当てます。割り当てるバイト数を引数に取り、割り当てられたメモリブロックへのvoidポインタを返します。割り当てに失敗した場合はNULLを返します。
malloc() を使用するには、<stdlib.h> をインクルードします:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 1つの整数用にメモリを割り当てる主なポイント:
- 返されたvoidポインタは、常に適切なデータ型にキャストしてください
- メモリは明示的に解放されるまで利用可能なままです
- 実行時に正確なメモリ量を要求できる柔軟性を提供します
- 必要な正確なバイト数を決定するには、
sizeof()を使用します
自分で試してみよう
#include <stdio.h>
#include <stdlib.h>
int main() {
// 入力を読み込む
int input_value;
scanf("%d", &input_value);
// TODO: 以下にコードを記述してください
// 1. malloc() を使用して、1つの整数用のメモリを割り当てる
// 2. 返されたポインタを int* にキャストする
// 3. 割り当てられたメモリに入力値を格納する
// 4. 格納された値を表示する
// 5. 同じ場所に2乗を計算して格納する
// 6. 2乗された値を表示する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。