Menu
Coddy logo textTech

メモリ確保の失敗を確認する

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 コードでは、クラッシュを防ぎ、適切にエラーを処理するために、常にこれらのチェックを含めます。

challenge icon

チャレンジ

簡単

malloc()を使用して動的メモリ割り当てを行う際の、適切なエラー処理を示すCプログラムを作成してください。プログラムは次の処理を行う必要があります。

  1. 格納するintegerの個数を表すinteger nをユーザーから読み取る
  2. malloc()sizeof()を使用して、n個のintegerのarray用のメモリを動的に割り当てる
  3. 返されたポインターがNULLかどうかをテストして、メモリの割り当てが成功したか確認する
  4. 割り当てに失敗した場合は、Memory allocation failed!と出力してprogramを終了する
  5. 割り当てに成功した場合は、Memory allocation successful!と出力する
  6. ユーザーからn個のinteger値を読み取り、割り当てられたarrayに格納する
  7. すべての値の合計を計算し、次の形式で出力する: Sum: [value]
  8. 割り当てられた合計バイト数を次の形式で出力する: 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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ