動的なメモリの割り当て

動的なメモリの割り当て

配列を使用するとき、要素数はあらかじめ決めておく必要がありました。

しかし、入力の状況に応じて要素数を決めたほうがメモリの節約になります。

ここでは、メモリ確保を動的に行うことで配列の要素数を制御する方法を紹介します。

 

N成分のベクトルの内積を計算するプログラムを考えましょう。

はじめに、Nをインプットして、後に行列を入力していきます。

少し考えると、ある問題にあたります。

行列につかう配列の大きさはどうしたりいのか、という問題です。

N=100にすればいいのか、N=1000にすればいいのか…

Nが小さすぎると、大きい行列が扱えず、

Nが大きすぎるとメモリをやたら消費してしまいます。

なんとかして、入力したNに応じた配列を設定できないものか…

と悩むわけです。

そこで利用するのが動的なメモリの割当です。

mallocとfree

では、さっそくN成分の配列を動的なメモリ割り当てを使って、定義します。

int N;
N=3;
int *A;
A=(int *)malloc(N*sizeof(int));

このようにmallocを使えばメモリを確保できます。mallocの命令は

void *malloc(確保するメモリの大きさ);

となります。sizeof(型)は型のメモリの大きさを出力します。そして、(int *)でint型のアドレスに変換しているわけです。

これで、N成分のベクトルが得られるわけです。

使い終わったらfreeという命令でメモリを開放します。

free(ポインタ);

これをしないとメモリを保持し続けるので、メモリの無駄遣いになります。

補足ですが、mallocやfreeを使うにはstdlib.hをインクルードする必要があります。

必ずメモリを確保したら解放するようにプログラムを組みましょう。

内積の計算プログラム

では、プログラムを組んでいきます。

#include <stdio.h>
#include <stdlib.h>
int main(void){
	int N,*A,*B,i,result;
	printf("成分数は?:");
	scanf("%d",&N);
	//メモリの確保
	A=(int *)malloc(N*sizeof(int));
	B=(int *)malloc(N*sizeof(int));
        if(!A){
		printf("割り当てエラー");
		exit(1);
	}
	if(!B){
		printf("割り当てエラー");
		exit(1);
	}
	//成分の入力
	for(i=0;i<N;i++){
		printf("A[%d]=",i);
		scanf("%d",&A[i]);
	}
	for(i=0;i<N;i++){
		printf("B[%d]=",i);
		scanf("%d",&B[i]);
	}
	//内積の計算
	result=0;
	for(i=0;i<N;i++){
		result=result+A[i]*B[i];
	}
	printf("内積は%dです",result);
	//メモリの解放
	free(A);
	free(B);
	return 0;
}

実行すれば、成分数に応じた内積の計算ができます。これで、メモリを無駄に大きく取る必要がないのでいいわけです。

stdlib.hをインクルードするのを忘れないでくださいね。

著者:安井 真人(やすい まさと)