• 締切済み

C言語について

以下のプログラムについて alice.txtからテキストを読み込みその中の異なる単語の数を求めるプログラムです #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(int); void all_words(void); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL) break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=(char*)strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } strcpy(word2,tp2); l=strlen(word2)-1; if(word2[l]=='\''){ word2[l]='\0'; } if(word2[l]==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(); return 0; } void all_words(void){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(n); } void count(int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("%d\n",n-y); free(m); fclose(fp2); } このプログラムを実行するとメモリリークになってしまうのですが 確保していないメモリ領域に代入しているのが原因らしいのですが いろいろ試してみたのですがメモリリークが直りません どうしたらよいでしょうか? よろしくお願いします

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>#define NMAX 80 >#define LMAX 5000 >char word3[LMAX][NMAX]; >char word1[NMAX]; >char word2[NMAX]; さらに >char word3[NMAX]; と…… まぁ、そうそうないとは思いますが環境によってはスタックオーバーフローするかも知れませんな。 ないとは思いますけどね……。 >char word3[LMAX][NMAX]; で、400000Byte。 >char word1[NMAX]; >char word2[NMAX]; >char word3[NMAX]; で240Byte。 その他の変数や引数、戻りアドレスとか積みますが……まぁ1Mありゃ十分だとは思いますけど……。 # Linux環境とかでulimit -s 256とかでもしてるとか? 一連の質問シリーズの最初の方のだとバッファオーバーランしそうなコードはありましたが、今のだとそういうのはなさげ…ですよねぇ?? 読み込むテキストファイルが1行80Byteを超えていた場合に期待する動作しない。というのはありますかね。 あとは…ShiftJISなファイルを読ませたときにstrtok()が妙なところでぶった切るかも知れない。 とかか?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>このプログラムについてメモリリークになってしまうのですが どうやってメモリリークと判断されたんですか? メモリリークの意味をわかって使われていますか? >確保していないメモリー領域に代入しているのが原因らしいのですが その原因(確保していないメモリー領域に代入している)はどうやって調べたんですか? >いろいろ試してみたのですがメモリリークが直りません 「いろいろ試してみた」と書かれても(実際に試してもいるんでしょうけど)、他者には何を試したのかさっぱりわかりません。 また原因がわかっていないのに、いろいろ試したところで解決することはまずありません。 ですのでまずすべきなのは、あなたのいうメモリリークの原因を調べる事です。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>このプログラムを実行するとメモリリークになってしまうのです そうなることをどうやって確認なさったのでしょうか。 >確保していないメモリ領域に代入しているのが原因らしい それが原因であるらしいことをどうやって確認なさったのでしょうか。 ちなみに、メモリーリークとは、 動的に確保した領域を確保しっぱなしで解放しないまま放っておくため、 使えるメモリー量が減少してくるという意味です。 「確保していないメモリ領域に代入している」という行為とは 対極にあるような気がしますし、そもそもそういう行為が本当にできるのか疑問です。

関連するQ&A

専門家に質問してみよう