こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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);
}
このプログラムを実行するとメモリリークになってしまうのですが
確保していないメモリ領域に代入しているのが原因らしいのですが
いろいろ試してみたのですがメモリリークが直りません
どうしたらよいでしょうか?
よろしくお願いします

投稿日時 - 2013-06-21 22:34:31

QNo.8143954

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.4

Wr5

>#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()が妙なところでぶった切るかも知れない。
とかか?

投稿日時 - 2013-06-22 01:48:14

ANo.3

>このプログラムについてメモリリークになってしまうのですが

どうやってメモリリークと判断されたんですか?
メモリリークの意味をわかって使われていますか?

>確保していないメモリー領域に代入しているのが原因らしいのですが

その原因(確保していないメモリー領域に代入している)はどうやって調べたんですか?

>いろいろ試してみたのですがメモリリークが直りません

「いろいろ試してみた」と書かれても(実際に試してもいるんでしょうけど)、他者には何を試したのかさっぱりわかりません。
また原因がわかっていないのに、いろいろ試したところで解決することはまずありません。
ですのでまずすべきなのは、あなたのいうメモリリークの原因を調べる事です。

投稿日時 - 2013-06-22 00:22:08

ANo.1

>このプログラムを実行するとメモリリークになってしまうのです

そうなることをどうやって確認なさったのでしょうか。

>確保していないメモリ領域に代入しているのが原因らしい

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

投稿日時 - 2013-06-21 22:49:41

あなたにオススメの質問