
以下のプログラムについてです。
test.txtというファイルを読み込み、その中の異なる単語の数を求めるプログラムです。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<stddef.h>
#define NMAX 80
#define LMAX 5000
void count(FILE*, int);
void all_words(FILE *);
FILE *fp, *fp2;
char *fn="alice.txt";
char *fn2="total word.txt";
char *ignore="\n !?()*-;:.,_\"[]";
int main(void){
int p=0, x, count, l, t=0,k=0;
char name[LMAX][NMAX], word1[NMAX], word2[NMAX];
char *tp, *tp2;
if((fp=fopen(fn,"r"))==NULL){
printf("Can't open '%s'.\n",fn);
exit(1);
}
if((fp2=fopen(fn2,"w"))==NULL){
printf("Can't open '%s'.\n",fn2);
exit(1);
}
for(count=0;count<LMAX;count++){
if(fgets(name[count],NMAX,fp)==NULL)break;
p++;
}
for(count=0;count<p;count++){
for(x=0;x<NMAX;x++){
word1[x]=tolower(name[count][x]);
}
tp=word1;
while((tp2=strtok(tp,ignore))!=NULL){
if(*tp2=='\''){
if(*(tp2+1)=='`')
t=1;
tp2++;
}
strcpy(word2,tp2);
k=l=strlen(word2)-1;
if(word2[k]==('\'' & l))
word2[l]='\0';
if(word2[0] =='\'' &&t==0){
if(word2[1]!='\0'){
fputs(word2+1,fp2);
fputc('\n',fp2);
}
}
else{
if(word2[0]!='\0'){
fputs(word2,fp2);
fputc('\n',fp2);
}
}
tp=NULL;
}
}
fclose(fp);
fclose(fp2);
all_words(fp2);
return 0;
}
void all_words(FILE* fp2){
char word3[NMAX];
int n=0;
if((fp2=fopen(fn2,"r"))==NULL){
printf("Can't open '%s'.\n", fn2);
exit(1);
}
for(;;){
if(fgets(word3, NMAX,fp2)==NULL)
break;
n++;
}
fclose(fp2);
count(fp2,n);
}
void count(FILE* fp2, int n){
int count, x, y=0;
char *m=(char *)malloc(n*NMAX);
char *xp,*yp;
if(m==NULL){
return ;
}
if((fp2=fopen(fn2,"r"))==NULL){
printf("Can't open '%s'.\n", fn2);
exit(1);
}
for(count=0,xp=m; count<n;count++,xp+=NMAX){
fgets(xp,NMAX,fp2);
}
qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp);
count=1;
for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){
if(strcmp(xp,yp)==0){
y++;
count++;
}
else{
count=1;
}
}
printf("KIDN OF WORD:%d\n",n-y);
if(m){
free(m);
m=NULL;
printf("%p\n",m);
}
fclose(fp2);
}
このプログラムを実行するとメモリリークになってしまいます
どうしたら良いでしょうか?
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
本題とは全く関係ありませんが, スコープが違うのでそれ自体は問題ありません>#1. ただし, 関数 count の内部では「cou
nt と書けば変数」になるので関数 count を直接再帰的に呼び出すことはできません.No.2
- 回答日時:
m=NULL;
printf("%p\n",m);
メモリを開放(free)した後でこれ必要かしら?と考えております。
Windows7+gccで、Gudenburg project のalice in wonderlandを読ませた場合、落ちずに終わります。
箇所の特定にgcc+gdbを使うならば、
gcc -g -O0 プログラム名.c -o foo.exe でコンパイルして、
gdb foo.exe で起動すると、”(gdb)”というプロンプトが出るので、 b 行数 でストップしたいプログラムの行数を指定します。次に、runを実行するとbで設定した箇所(ブレークポイント)まで実行します。それまでの箇所にエラーがあれば、落ちます。例えば無理やりバッファオーバーランさせると、
Breakpoint 1, main () at alice.c:31
31 scanf("%d", i);
(gdb) n
1235
3 [main] a 2564 exception::handle: Exception: STATUS_ACCESS_VIOLATION
994 [main] a 2564 open_stackdumpfile: Dumping stack trace to a.exe.stackdump
問題の箇所が特定できるまでブレークポイントで絞り続けます。問題の箇所がわかったら原因を考えます。箇所が分からない状態で悩むのはかなり大変な作業です。
参考URL:http://uguisu.skr.jp/Windows/gdb.html
No.1
- 回答日時:
リークの原因かはわからないが
void count(FILE* fp2, int n){
int count, x, y=0;
Cでは関数名と変数名は同じにできなかったと思う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
256*256の読み込み、fscanfでは...
-
テキストを一文字以上ずつ読み...
-
C言語 ファイル入出力について
-
CSVファイルの内容を構造体に格...
-
OpenGLによる描画内容をBMP出力
-
大量の入力ファイルを扱うとき...
-
fopenの使い方
-
自己相関関数を求めるプログラ...
-
辞書順にソートしたいのですが...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
Winsockの通信処理にてファイル...
-
C言語による画像処理で出力時に...
-
ガンマ変換 C言語でプログラ...
-
C言語におけるファイル読み込み...
-
テキストファイルに出力した結...
-
C言語 連番データの読み込み
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日本語ファイル名のFTPについて
-
C言語でファイル読み書きを早く...
-
複数ファイルの同時読み込みの...
-
ファイル出力で改行を入れたい!
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
テキストファイル内に対して, ...
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
VisualStudioでのファイルの入...
-
C言語にてXMLファイルから任意...
-
datファイルの読み込み
-
CSVファイルの内容を構造体に格...
-
C言語 連番データの読み込み
-
Winsockの通信処理にてファイル...
-
fopenでファイル名に、変数を使...
-
容量の大きいCSVファイルの読み...
-
画像の白黒表示
-
ライブラリ関数と同名のメンバ関数
-
YUV動画像を1ピクセルごとにず...
おすすめ情報