動的メモリ確保 - malloc()
CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 32/63。
ここでは、プログラムの実行中にヒープからメモリを要求するための主要な関数である malloc() について学びます。malloc() 関数は「memory allocation」を意味し、コンパイル時に固定サイズの変数を宣言するのではなく、必要なときに動的にメモリを allocate できるようにします。
malloc()関数は1つの引数、つまり allocate したいバイト数を受け取ります。allocate されたメモリブロックへのvoid pointerを返し、allocationに失敗した場合は NULL を返します。void pointerを返すため、型付きの pointer に直接代入できます。Cではキャストは省略可能です(キャストが必須のC++とは異なります)。
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 1つの整数用のメモリを割り当てる
// ptr は現在、整数を保持できるメモリ位置を指している
malloc()の主な利点は柔軟性です。実行時に必要な量のメモリを正確に要求でき、そのメモリは明示的に解放するまで利用可能なままです。これは、プログラムの実行が始まるまで必要なメモリの量がわからない場合に特に便利です。
malloc()を使用するには<stdlib.h>をincludeすることを忘れないでください。返されたvoidポインターのキャストはCでは任意です。割り当て先の型に自動的に変換されるためです。
チャレンジ
簡単malloc()を使用してヒープ上に単一のintegerを作成し操作する、動的なmemory allocationを示すCプログラムを作成してください。プログラムでは次のことを行います。
malloc()を使用して1つのinteger用のmemoryを動的にallocateする- returned void pointerをinteger pointerにCastする
- ユーザーのinputからinteger値をReadする
- dereference operatorを使用して、input値を動的にallocateされたmemoryにStoreする
- stored値を次の形式でPrintする:
Stored value: [value] - 値のsquareをCalculateし、同じmemory locationにStoreする
- squared値を次の形式でPrintする:
Squared value: [value]
malloc()を使用するには、<stdlib.h> headerをincludeすることを忘れないでください。プログラムでは、動的なmemory allocationの基本的なworkflow、つまりヒープからmemoryを要求し、それを使用してdataをStoreおよび操作し、pointer operationsを通じてallocated memoryを扱う流れを示してください。
たとえば、ユーザーが7をinputすると、outputは次のようになります。
Stored value: 7
Squared value: 49このchallengeでは、動的なmemory allocationの基本概念を学びます。これは、compile時にmemoryが固定されるのではなく、runtimeでmemoryが要求される仕組みであり、プログラムのmemory usageにおける柔軟性を高めます。
自分で試してみよう
#include <stdio.h>
#include <stdlib.h>
int main() {
// 入力を読み取る
int input_value;
scanf("%d", &input_value);
// TODO: 以下にコードを書いてください
// 1. malloc() を使用して整数1つ分のメモリを割り当てる
// 2. 返されたポインタを int* にキャストする
// 3. 入力値を割り当てたメモリに格納する
// 4. 格納した値を出力する
// 5. 平方を計算して同じ場所に格納する
// 6. Print the squared value
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ