Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のmalloc関数とは?動的メモリ確保の基本とサンプルコードを解説


課題

動的メモリ確保関数を使用して、複数の要素を入力・表示し、その合計値を計算するCプログラムを作成します。

malloc関数とは

C言語における標準ライブラリ関数 malloc は、プログラムの実行時(ランタイム)に指定したバイト数分のメモリブロックを動的に確保する関数です。戻り値は void 型ポインタで、確保されたメモリ領域の先頭アドレスを指します。なお、malloc で確保したメモリは初期化されていないため、不定な値(ゴミ値)が含まれた状態になっている点に注意が必要です。

構文

void *malloc(サイズ(バイト数))

具体的な使用例は以下の通りです。

  • int *ptr;
    ptr = (int *)malloc(1000);  // 1000バイト分のメモリを確保

  • int *ptr;
    ptr = (int *)malloc(n * sizeof(int));  // int型 n個分のメモリを確保

注意: 空きメモリが不足している場合、malloc 関数は NULL を返します。

サンプルプログラム

次のプログラムでは、まずユーザーから要素数を受け取り、malloc を使ってその分だけメモリを動的に確保します。確保が成功したかどうかを NULL チェックで確認した後、各要素を読み込んで合計を求めます。最後に free 関数でメモリを解放し、解放後の領域を再表示することで、メモリに不定な値が残っている様子を確認できます。

#include<stdio.h>
#include<stdlib.h>
void main(){
   //変数とポインタ、合計値sumの宣言//
   int numofe,i,sum=0;
   int *p;
   //ユーザーから要素数を読み込む//
   printf("Enter the number of elements : ");
   scanf("%d",&numofe);
   //malloc()関数の呼び出し//
   p=(int *)malloc(numofe*sizeof(int));
   /*メモリが正常に確保・予約できたかどうかを
   必ず確認する必要があるため、if文を使用*/
   if (p==NULL){
      printf("Memory not available");
      exit(0);
   }
   //要素の入力//
   printf("Enter the elements : \n");
   for(i=0;i<numofe;i++){
      scanf("%d",p+i);
      sum=sum+*(p+i);
   }
   printf("\nThe sum of elements is %d",sum);
   free(p);//メモリを解放//
   printf("\nDisplaying the cleared out memory location : \n");
   for(i=0;i<numofe;i++){
      printf("%d\n",p[i]);//ゴミ値(不定な値)が表示される//
   }
}

実行結果

Enter the number of elements : 5
Enter the elements :
23
45
65
12
23

The sum of elements is 168
Displaying the cleared out memory location :
10753152
0
10748240
0
23

ポイントまとめ

  • malloc関数を使うと、実行時に必要なサイズのメモリを柔軟に確保できます。
  • 戻り値は void 型ポインタのため、適切なデータ型へキャストして利用します。
  • メモリ確保の成否は必ず NULLチェック で確認しましょう。
  • 使い終わったメモリは free関数 で解放するのがC言語の基本ルールです。
  • 解放後のメモリ領域には不定な値(ゴミ値)が残るため、参照には十分注意してください。

  1. C言語入門:モノリシックプログラミングとモジュラープログラミングの違いを徹底解説

    本記事では、C言語におけるモノリシックプログラミングとモジュラープログラミングの違いを、それぞれのメリット・デメリットとともに詳しく解説します。 モノリシックプログラミングとは プログラム全体を1つの関数、すなわちmain関数だけですべて記述する方式を「モノリシック(一枚岩)型プログラミング」と呼びます。しかし、すべてのロジックを単一の関数に詰め込むのは、良いプログラミングスタイルとは言えません。 デメリット モノリシックプログラミングには、以下のような欠点があります。 プログラムが非常に大きく、複雑になりやすい。 デバッグ、テスト、保守が非常に困難になる。 モジュラープログラミングとは

  2. C言語のbar()関数とは?グラフィックスで塗りつぶし矩形を描く方法

    bar() 関数は、C言語のグラフィックス描画に使用される関数の一つです。図形を描くための各種関数がまとめられた graphics.h ヘッダーファイルの中に定義されており、このヘッダーをインクルードすることで利用できます。bar()関数の構文void bar(int left, int top, int right, int bottom);bar() 関数は、棒グラフの「バー」のような2次元の図形、すなわち塗りつぶされた長方形を描画するために使われます。引数は4つあり、それぞれ以下の座標を指定します。left / top: 長方形の左上隅の (X, Y) 座標right / bottom: