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

C言語の動的メモリ割り当て(malloc)を使ってn個の数値の合計を計算するサンプルプログラム

問題

C言語において、動的メモリ割り当て関数を使用して、ユーザーが入力したn個の数値を表示し、その合計を計算するにはどうすればよいのでしょうか。

解決策

以下に示すのは、動的メモリ割り当て関数を使用して、ユーザーが入力したn個の要素を表示し、その合計を計算するC言語のサンプルプログラムです。このプログラムでは、必要な分だけメモリを確保することで、メモリの無駄遣いを最小限に抑える工夫も行っています。

動的メモリ割り当てでは、stdlib.hヘッダーファイルに含まれるmalloc()関数を使用します。実行時に必要なサイズのメモリを確保できるため、配列のようにあらかじめ最大サイズを決めておく必要がなく、効率的なメモリ管理が可能になります。

サンプルコード

#include<stdio.h>
#include<stdlib.h>
void main(){
   //変数とポインタ、合計値の宣言//
   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]);//ガベージ値が表示される//
   }
}

コードのポイント

  • malloc()関数: numofe * sizeof(int)バイト分のメモリをヒープ領域から動的に確保します。戻り値はvoid *型なので、(int *)でキャストしています。
  • NULLチェック: メモリ確保が失敗した場合、malloc()はNULLを返します。必ずif文でチェックし、失敗時にはエラーメッセージを表示してプログラムを終了させることが重要です。
  • free()関数: 使用済みのメモリを解放します。解放後のメモリ領域にアクセスすると、予測できない値(ガベージ値)が表示される点にも注目してください。これは未定義動作の一例であり、実際の開発では解放後のポインタアクセスは避けるべきです。

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。

Enter the number of elements: 4
Enter the elements:
23
45
67
89
The sum of elements is 224
Displaying the cleared out memory location:
7410816
0
7405904
0

入力した4つの数値(23 + 45 + 67 + 89)の合計である224が正しく表示されています。また、free()でメモリを解放した後に同じ領域へアクセスすると、元のデータではなく意味のない値(ガベージ値)が出力されることが確認できます。このことから、動的に確保したメモリは解放後には使用しないという原則が理解できるでしょう。

  1. C言語のisupper()関数とは?使い方とサンプルコードを解説

    C言語のisupper()関数は、指定された文字が大文字アルファベットかどうかを判定するための標準ライブラリ関数です。文字が大文字であれば0以外の値(真)を返し、大文字でなければ0(偽)を返します。この関数を使用するには、ヘッダーファイル「ctype.h」をインクルードする必要があります。isupper()関数の構文int isupper(int character);引数character:大文字かどうかを判定したい文字を指定します。戻り値文字が大文字の場合:0以外の値(真)を返す文字が大文字でない場合:0(偽)を返すisupper()関数の使用例以下は、C言語でisupper()関数を使用

  2. C言語のisalnum()関数とは?使い方とサンプルコードをわかりやすく解説

    C言語のisalnum()関数は、指定された文字が英数字(アルファベットまたは数字)であるかどうかを判定するための標準ライブラリ関数です。引数として渡された文字が英字や数字であれば0以外の値(真)を返し、それ以外の文字であれば0(偽)を返します。この関数を使用するには、ヘッダーファイル「ctype.h」をインクルードする必要があります。isalnum()関数の構文int isalnum(int character);パラメータの説明:character − 英数字かどうかを判定したい文字(int型として渡します)isalnum()関数の使用例以下は、C言語でisalnum()関数を使った具体的