メモリ確保の失敗を確認する
CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 34/63。
malloc() は動的メモリ割り当ての強力なツールですが、理解しておくべき重要な現実があります。malloc() は失敗する可能性があります。システムで利用可能なメモリが不足すると、malloc() は要求を満たせず、有効なメモリアドレスの代わりに NULL を返します。
つまり、malloc()を使うたびに、返されたポインターを使おうとする前に、割り当てが成功したかどうかを確認する必要があります。NULL ポインターを使うと、program がセグメンテーションフォルトでクラッシュします。
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // プログラムを終了するか、エラーを処理する
}
// ここで ptr を安全に使用できる
*ptr = 42;この NULL チェックは任意ではありません。堅牢な C プログラムを書くために不可欠です。現代のシステムでは Memory の割り当て失敗はまれであっても、特にリソースが制限された環境や大量の Memory を要求する場合には発生する可能性があります。プロフェッショナルな C コードでは、クラッシュを防ぎ、適切にエラーを処理するために、常にこれらのチェックを含めます。
チャレンジ
簡単malloc()を使用して動的メモリ割り当てを行う際の、適切なエラー処理を示すCプログラムを作成してください。プログラムは次の処理を行う必要があります。
- 格納するintegerの個数を表すinteger
nをユーザーから読み取る malloc()とsizeof()を使用して、n個のintegerのarray用のメモリを動的に割り当てる- 返されたポインターが
NULLかどうかをテストして、メモリの割り当てが成功したか確認する - 割り当てに失敗した場合は、
Memory allocation failed!と出力してprogramを終了する - 割り当てに成功した場合は、
Memory allocation successful!と出力する - ユーザーから
n個のinteger値を読み取り、割り当てられたarrayに格納する - すべての値の合計を計算し、次の形式で出力する:
Sum: [value] - 割り当てられた合計バイト数を次の形式で出力する:
Bytes allocated: [value]
malloc()を使用するために、<stdlib.h>ヘッダーをincludeすることを忘れないでください。割り当てられたメモリを使用する前に、割り当ての失敗を確認するという基本的な実践方法を、programで示す必要があります。
たとえば、入力が次のとおりの場合:
4
10 20 30 40出力は次のようになります:
Memory allocation successful!
Sum: 100
Bytes allocated: 16このchallengeでは、動的メモリ割り当てを扱う際の防御的programmingの重要性を強調しています。予期せずクラッシュするのではなく、メモリ割り当ての失敗の可能性をprogramが適切に処理できるようにすることが目的です。
自分で試してみよう
#include <stdio.h>
#include <stdlib.h>
int main() {
// 整数の個数を読み取る
int n;
scanf("%d", &n);
// TODO: ここにコードを書いてください
// - malloc() を使って n 個の整数用のメモリを割り当てる
// - 割り当てが成功したか確認する
// - 成功と失敗の両方のケースを処理する
// - 整数を読み取って格納する
// - Calculate the sum and bytes allocated
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ