重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!gooアプリ版

よろしくお願いします。
一ファイル20万行程度のCSV形式のテキストファイルが、50個ほどあります。
これを一行づつ読み込んで、strtok( ,",")でデータを取得しようと思っています。

ファイルの行数はまちまちなので、新しいファイルを読み込むときに
そのファイルの行数を調べて(ここでは count 行あります)
callocをつかって、メモリを確保しました。

btxt=(char **)calloc(count,sizeof(char *));/*動的メモリ確保*/
for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/
if(btxt==NULL){printf("btxt 確保エラー\n"); exit(0);}

上記btxt配列にすべての行数を読み込んで、strtok()処理をした後
for(v=0;v<120;v++){
if(btxt[v]){
free(btxt[v]);
btxt[v]=NULL;
}
 }
free(btxt);
 btxt=NULL;

で解放してから、次のファイルに移ります。
問題は、ループするごとにメモリ容量がどんどん減ってきて、30ループもさせると
メモリ不足でエラーが出ることです。
ブレークポイントを使って調べてみたのですが

ループ一回目 calloc前 707.7 MB: calloc後 748.6MB 解放(したつもり)後 747.9 MB
ループ二回目 calloc前 750.6 MB: calloc後 794.6MB 解放(したつもり)後 793.8 MB
・・・・・・・・・・・・・・・・・・・
ループ四回終了時には868.3MBにもなって、初めより160MBも使ってしまいます。

free()が効いてないと思うのですが、どこがおかしいのか教えてくださいませ。

A 回答 (2件)

for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/


for(v=0;v<120;v++) if(btxt[v]){free(btxt[v]);btxt[v]=NULL;}

上の2行をよく見比べてください。何回callocして何回freeしてますか?
    • good
    • 0
この回答へのお礼

だぁ~ お恥ずかしい。
何回callocして何回freeしているか。肝に銘じます。

お礼日時:2012/02/10 04:06

for(v=0;v<120;v++){





for(v=0;v<count;v++){

にしないとダメなんじゃないでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
三日ほど悩んでましたw。

お礼日時:2012/02/10 05:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!