動的メモリ確保 - malloc()
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 32/63。
これから、プログラムの実行中にヒープからメモリを要求するための主要な関数であるmalloc()について学びます。malloc()関数は「memory allocation(メモリ割り当て)」の略で、コンパイル時に固定サイズの変数を宣言するのではなく、必要な時にメモリを動的に割り当てることができます。
malloc()関数は、割り当てたいバイト数という1つの引数を取ります。これは、割り当てられたメモリブロックへのvoidポインタを返します。割り当てに失敗した場合はNULLを返します。voidポインタを返すため、型付きポインタに直接代入できます。C(キャストが必要なC++とは異なり)では、キャストは任意です。
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 1つの整数用にメモリを割り当てる
// ptrは整数を保持できるメモリ位置を指すようになります
malloc()の主な利点は柔軟性です。実行時に必要なメモリ量を正確に要求でき、明示的に解放するまでそのメモリは利用可能なまま残ります。これは、プログラムが実行されるまでどの程度のメモリが必要か分からない場合に特に便利です。
malloc()を使用するには、<stdlib.h>をインクルードすることを忘れないでください。返されたvoidポインタのキャストは、代入先の型に自動的に変換されるため、C言語では任意です。
チャレンジ
簡単malloc() を使用してヒープ上に単一の整数を作成し、操作することで、動的メモリ割り当てを実演するC言語プログラムを作成してください。プログラムは以下の手順で行う必要があります:
malloc()を使用して、1つの整数分のメモリを動的に割り当てる- 返された void ポインタを整数ポインタにキャストする
- ユーザー入力から整数値を読み込む
- 間接参照演算子を使用して、入力された値を動的に割り当てられたメモリに格納する
- 格納された値を次の形式で出力する:
Stored value: [value] - 同じメモリ位置に、その値の2乗を計算して格納する
- 2乗された値を次の形式で出力する:
Squared value: [value]
malloc() を使用するために <stdlib.h> ヘッダーをインクルードすることを忘れないでください。このプログラムは、ヒープからのメモリ要求、データの格納と操作、およびポインタ操作を通じた割り当て済みメモリの利用という、動的メモリ割り当ての基本的なワークフローを示す必要があります。
例えば、ユーザーが 7 と入力した場合、出力は以下のようになります:
Stored value: 7
Squared value: 49このチャレンジでは、メモリがコンパイル時ではなく実行時に要求される動的メモリ割り当ての基本概念を学びます。これにより、プログラムのメモリ使用における柔軟性が向上します。
自分で試してみよう
#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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。