その後でcallocにより領域の動的確保、初期化をしました。
そしてファイルを読み込んで値を代入して最後にヒープ領域を解放するプログラムを作成しました。
初めはborland5.5で行っていたのですが配列を2次元に拡張するとうまくいかなくなりました。
自分なりに条件を変えながら変数を調べたりした結果
最初に確保したアドレスと代入した後のアドレスが変わっている事までは分かったのですが
それがなぜそうなるのかまでは分かりませんでした。
コンパイラを変えてVC++2008をインストールして試してみたところ1次元配列のプログラムで
一応目的の結果は達成しているものの最後のヒープ解放でエラーが出ました。以下エラー文です。
# WindowsによってDataCombine.exe(このプログラム名)でブレークポイントが発生しました。
# ヒープが壊れていることが原因として考えられます。
# DataCombine.exeまたは読み込まれたDLLにバグがあります。
ソースも載せておきます。
#include <stdafx.h> #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char buf[128]; double *freq=NULL, *er=NULL, *ei=NULL; int i; freq=(double *)calloc(301, sizeof(double)); if(freq==NULL) goto ErrorEnd; er=(double *)calloc(301, sizeof(double)); if(er==NULL) goto ErrorEnd; ei=(double *)calloc(301, sizeof(double)); if(ei==NULL) goto ErrorEnd; if((fp=fopen("c:\\w001.prn", "r"))==NULL){ fprintf(stderr, "%sは存在しない\n", "w001.prn"); goto ErrorEnd; } fgets(buf, 128, fp); //ファイルの1行目はとばす i=0; while(!feof(fp)){ if(fgets(buf, 128, fp)!=NULL) sscanf(buf, "%lf %lf %lf", &freq, &er, &ei); freq/=1000000000; i++; } fclose(fp); for(i=0; i<301; i++) printf("%lf %lf %lf\n", freq, er, ei); ErrorEnd: free(freq); free(er); free(ei); getchar(); return 0; }
読み込むファイルw001.prnは1行目は「freq er ei」というタイトル、
2行目からはタブで区切られた3つの数値が301行あるというものです。
私の環境としてOSはvista home premiumです。
どこに問題があるでしょうか。分かる方どうぞご教授お願いします。
よろしくお願いします。