電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

②エラーチェック

スポンサーリンク

mallocを使って行う典型的な仕事はエラーを処理することである。
メモリが足りないときに対処するわけですが、処理をするのにもメモリが必要になるわけです。
そこでmallocであらかじめ無駄なメモリを確保しておいていざとなったらfreeする。
という方法がとられます。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N	6
int sort(int input[],int output[],int size);

int main(){
	int input[N]={21,32,423,21,43,512};
	int output[N];
	int i;
	int answer=1;
	for(i=0;i<N;i++)
		printf("%d\t",input[i]);
	puts("");
	answer=sort(input,output,N);
	if(answer){
		for(i=0;i<N;i++)
			printf("%d\t",output[i]);
		puts("");
	}
}
	
int sort(int *input,int *output,int size)
{

	int i,j,k;
	int temp;
	int *p;
	
	if(NULL==(p=malloc(sizeof(int)*sizeof(*output))))
	{
		free(p);
		return 0;
	}
	for(i=0;i<size;i++)
		output[i]=input[i];	
	for(i=1;i<size;i++)
	{
		for(j=0;j<i&&output[i]>output[j];j++);
			if(j<i)
			{
				temp=output[i];
				for(k=i-1;k>=j;k--)
					output[k+1]=output[k];
				output[j]=temp;
			}
		
	}
	free(p);
}
		
結果
21      32      423     21      43      512
21      21      32      43      423     512

あまりうまいコードが書けなかった。
普通の挿入ソートなのですがoutputのデータが取れなかったら(==NULL)なら
free(p)して戻っていく。

assert

mallocの戻り値をチェックする際に使う。
assertはマクロで、引数の式が偽となる場合に、プログラムを以上終了させるもの。

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

main(){
	char *p;
	p=malloc(0);
	assert(p);
}
結果
Assertion failed: p, file assert.c, line 8

Abnormal program termination

こんな感じになる。
確認のためにassertを書いておくとバグ発見に役立つ。