②エラーチェック
スポンサーリンク
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を書いておくとバグ発見に役立つ。