電子書籍の厳選無料作品が豊富!

初めにお断りしておきたい事があります。
出先で緊急な事でしたので、今即興で書いたソースになります。
Cコンパイル環境が有りませんでしたので、動作確認がとれておりません。

その為、ケアレスミス等有るかもしれませんがご容赦願います。


例として標準入力より文字列を取得する処理を記述しました。

以下の処理でreallocの際の断片化対策となるでしょうか。
(最終的に*strにセットされている領域が断片化されていない事)

実際の処理では1行辺り0~30000文字程の可変長の文字列を読み込む事を想定しております。
C(windows)のみ可でC++は不可になります。

その他、冗長な記述等指摘が有りましたらよろしくお願い致します。


#define MAX_BUF_SIZE 128

int getText(char **str) {
char *buf[MAX_BUF_SIZE];
char *tmp = NULL;
int tmpsize = 0;

if ((tmp = (char*) malloc(1)) == NULL) {
return FALSE;
}

*tmp = '\0';

while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) {
tmpsize += MAX_BUF_SIZE;
if ((tmp = realloc(tmp, tmpsize)) == NULL) {
free(tmp);
return FALSE;
}
strcat(tmp, buf);
}

if (*str != NULL) {
free(*str);
}

if (*str = (char*) malloc(strlen(tmp) + 1) != NULL) {
return FALSE;
}

strcpy(*str, tmp);
free(tmp);

return TRUE;

}

A 回答 (5件)

>free(NULL); してしまい


確かfree にNULLポインタが渡された場合、free は、"何もしない"
と思いました
    • good
    • 0

>はい、そうです。



>今までreallocで確保を繰り返していたのでメモリ上>でフラグメンテーションが起こっているとの指摘で>したので。

じゃあこのソースでもだめです。
WindowsならVirtualAllocとかで予め大きく仮想メモリを予約しておくとかで解決できるかもしれません。
それかreallocで大き目にメモリ確保してreallocの回数を減らすようにしてみるべきです。
    • good
    • 0
この回答へのお礼

> WindowsならVirtualAllocとかで予め大きく仮想メモリを予約しておくとかで解決できるかもしれません。
> それかreallocで大き目にメモリ確保してreallocの回数を減らすようにしてみるべきです。

ありがとうございます。
やはりreallocで実装する場合は回数を減らすしかないのですね。

お礼日時:2006/04/28 19:49

while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) {


tmpsize += MAX_BUF_SIZE;
if ((tmp = realloc(tmp, tmpsize)) == NULL) {
free(tmp);
return FALSE;
}
strcat(tmp, buf);
}
それよりも、このstrcatは危険です。
確かreallocは新たに増加した分のメモリ初期化をしません。
この点には注意してください。
    • good
    • 0
この回答へのお礼

> 確かreallocは新たに増加した分のメモリ初期化をしません。
> この点には注意してください。

ご指摘ありがとうございます。
了解しました。

お礼日時:2006/04/28 19:51

何を心配しているのか不明ですが, malloc で確保されたメモリは (少なくとも) 引数で指定された分だけは連続しているにきまっています. もちろん, realloc を繰り返したときに「それらが連続しているか」は全くわかりません.


むしろ
if ((tmp = realloc(tmp, tmpsize)) == NULL) {
free(tmp);
return FALSE;
}
の方が危険. realloc が NULL を返すと tmp == NULL となって free(NULL); してしまい, それまでに確保していた分を解放できなくなってしまいます.
    • good
    • 0
この回答へのお礼

> 何を心配しているのか不明ですが
今までreallocを繰り返していたので、mallocで再確保して文字列コピーする事によって断片化を解消しようと考えました。

> realloc が NULL を返すと tmp == NULL となって free(NULL); してしまい, それまでに確保していた分を解放できなくなってしまいます.
ご指摘ありがとうございます。
対処致します。

とりあえず*strに期待通りに確保出来ている事が判りましたので、締め切らせていただきます。
どうもありがとうございました。

お礼日時:2006/04/28 19:44

断片化って実メモリ上の断片化の話をしていますか?

    • good
    • 0
この回答へのお礼

はい、そうです。

今までreallocで確保を繰り返していたのでメモリ上でフラグメンテーションが起こっているとの指摘でしたので。

お礼日時:2006/04/28 19:35

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