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

【C言語】動的メモリ確保を使って配列の最大値・最小値を求めるプログラム

C言語では、実行時に必要なメモリ量を柔軟に確保できる「動的メモリ確保」という仕組みが用意されています。本記事では、動的メモリ確保を活用して、配列内の最大値と最小値を求めるプログラムを解説します。

問題

C言語で動的メモリ確保を使用し、配列の中から最大値と最小値を見つけるプログラムを作成します。

動的メモリ確保とは

動的メモリ確保を利用すると、C言語のプログラマはコンパイル時ではなく実行時(ランタイム)にメモリを割り当てることができます。これにより、ユーザーの入力サイズなどに応じて柔軟にメモリを管理できます。

実行時にメモリを動的に確保するために使用される主な関数は以下のとおりです。

  • malloc()関数: 実行時に指定したバイト数分のメモリブロックを1つ確保します。確保された領域は初期化されないため、必要に応じて初期化が必要です。
  • calloc()関数: 実行時に連続した複数のメモリブロックを確保します。malloc()と異なり、確保した領域はすべて0で初期化されます。
  • realloc()関数: すでに確保済みのメモリ領域のサイズを縮小または拡張します。
  • free()関数: 使用済みのメモリ領域を解放し、システムに返却します。メモリリークを防ぐために必ず呼び出すようにしましょう。

配列の最大値・最小値を求めるロジック

まず、配列用のメモリを動的に確保します。

p=(int*)malloc(n*sizeof(int)); //動的メモリ確保
for(i=0;i<n;i++){
    scanf("%d",p+i);
    if(*(p+i)>max) //最大要素の判定
       max=*(p+i);
}

最小値を求める場合も同様に、比較条件を逆にするだけです。

for(i=0;i<n;i++){
    scanf("%d",p+i);
    if(*(p+i)<min) //最小要素の判定
       min=*(p+i);
}

ポイントは、変数 max を表現可能な最小値(-32768)で、min を最大値(32767)でそれぞれ初期化しておくことです。こうすることで、入力されたどの値とも正しく比較できます。なお、より移植性の高いコードにしたい場合は、<limits.h> ヘッダーの INT_MAXINT_MIN マクロを使用するとよいでしょう。

サンプルプログラム

#include<stdio.h>
int main(){
   int *p,n,i,max=-32768,min=32767;
   printf("\n サイズを入力してください:");
   scanf("%d",&n);
   p=(int*)malloc(n*sizeof(int)); //動的メモリ確保
   printf("\n 要素を入力してください:");
   for(i=0;i<n;i++){
      scanf("%d",p+i);
      if(*(p+i)>max) //最大要素の判定
         max=*(p+i);
      if(*(p+i)<min) //最小要素の判定
         min=*(p+i);
   }
   printf("\n 最大値=%d\n 最小値=%d",max,min);
   free(p); //メモリ解放
}

実行結果

たとえば、サイズとして5を入力し、要素として「10, 25, 3, 48, 7」を入力した場合の出力は以下のようになります。

サイズを入力してください:
5
要素を入力してください:
10 25 3 48 7

最大値=48
最小値=3

なお、何も入力せずにループがスキップされた場合には、初期値のまま「maximum=-32768」「minimum=32767」が出力されます。

まとめ

このプログラムでは、malloc() によって実行時に必要なサイズのメモリを確保し、ポインタ演算を通じて各要素にアクセスしています。処理完了後には free() でメモリを解放することで、安全かつ効率的なメモリ管理を実現しています。動的メモリ確保をマスターすれば、入力サイズが事前にわからないデータでも柔軟に扱えるようになります。

  1. C言語における静的メモリ割り当てとは?仕組みとサンプルコードで徹底解説

    C言語でプログラムが使用するメモリは、大きく分けて「静的メモリ割り当て」と「動的メモリ割り当て」の2つの方法で確保されます。 静的メモリ割り当て(Static Memory Allocation)とは 静的メモリ割り当てとは、変数のサイズがプログラムの実行前に決定され、固定サイズの領域として割り当てられる方式です。一度確保されたメモリは、明示的に解放することはできません。プログラム内で宣言された変数に対して、あらかじめメモリが割り当てられます。 静的メモリ割り当ての主な特徴 アドレス演算子「&」を使って変数のアドレスを取得し、ポインタに代入することができます。 メモリはコンパイル時

  2. C言語における各式の種類を徹底解説!初心者向けにサンプルコード付きで紹介

    式(Expression)とは、演算子とオペランド(被演算子)を組み合わせたものであり、評価すると必ず単一の値に帰着します。演算はデータ項目に対して行われ、このデータ項目を「オペランド」と呼びます。一方、演算子はデータに対して実行すべき操作を表す記号です。例えば、次のような式を考えてみましょう。z = 3 + 2 * 1→ z = 5C言語の主な式の種類一次式(Primary Expression):名前(変数)、定数、あるいは括弧で囲まれた式からなる最も基本的なオペランドです。例:c = a + (5 * b);後置式(Postfix Expression):演算子がオペランドの後ろに置かれ