←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3626

どこでfree?
投稿者---kaoru(2005/03/31 17:55:02)


下記のような関数を作成したのですが、
free(q)は、どこで呼べばよいのでしょうか?
本来なら、mallocした関数内だと思うのですが、
funcの中ですとreturnできませんし・・・。

(↓エラー処理は省いています。)

int main( void )
{
    char *p = "aaa\tbbb\tccc\tddd\r\n111\t222\t333\t444\r\n999";
    char *q = NULL;

    q = func(p, "\r\n");
}

static char * func(char *Buf, char *Delimiter)
{
    char *p = NULL;
    int size = 0;
    char *q = NULL;

    p = strstr(Buf, Delimiter);

    // 見つからない

    if (p == NULL)
    {
        return (NULL);
    }

    // 見つかった

    size = p-Buf;
    q = (char *)malloc(size);
    memset(q, 0x00, size);
    memcpy(q, Buf, size);
    return (q);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:どこでfree? 3627 REE 2005/03/31 18:19:07


No.3627

Re:どこでfree?
投稿者---REE(2005/03/31 18:19:07)


>下記のような関数を作成したのですが、
>free(q)は、どこで呼べばよいのでしょうか?
>本来なら、mallocした関数内だと思うのですが、
>funcの中ですとreturnできませんし・・・。

qを使わなくなった場所です。
funcの中で行う必要はありません。

本題とは関係有りませんが、このままのfunc関数では、使い物になりません。
なぜならば、戻り値のポインタがさす領域の有効な範囲を呼び出し側で識別できないためです。



この投稿にコメントする

削除パスワード

No.3628

Re:どこでfree?
投稿者---kaoru(2005/03/31 18:59:52)


>qを使わなくなった場所です。
>funcの中で行う必要はありません。

そうだったのですね。
では、この場合、main関数の最後でやればよいのですね!
ありがとうございます。

>本題とは関係有りませんが、このままのfunc関数では、使い物になりません。
>なぜならば、戻り値のポインタがさす領域の有効な範囲を呼び出し側で識別できないためです。

main関数の最後に、
printf("%s", q);
の一文を入れて、VCで試してみましたが、aaa\tbbb\tccc\tddd・・・
となった(OKだった)のですが・・・???



この投稿にコメントする

削除パスワード

No.3629

Re:どこでfree?
投稿者---REE(2005/03/31 20:18:45)


>>本題とは関係有りませんが、このままのfunc関数では、使い物になりません。
>>なぜならば、戻り値のポインタがさす領域の有効な範囲を呼び出し側で識別できないためです。
>
>main関数の最後に、
>printf("%s", q);
>の一文を入れて、VCで試してみましたが、aaa\tbbb\tccc\tddd・・・
>となった(OKだった)のですが・・・???

dddの後にゴミが表示される可能性があります。
もし、ゴミがなかったのであれば、それは偶然です。
なぜならば、dddの後に'\0'が入っている保証がないからです。



この投稿にコメントする

削除パスワード

No.3630

Re:どこでfree?
投稿者---chu-(2005/04/01 00:37:51)


Cでは文字並びの最後にターミネータ(0x00,'\0')を入れて文字列として扱います。
size = p-Buf;では、ターミネータ分のmallocができておらず、memsetでの0x00セットもできていません。


この投稿にコメントする

削除パスワード

No.3631

Re:どこでfree?
投稿者---kaoru(2005/04/01 03:00:45)


REE様、chu-様、ありがとうございます。

最初のfunc関数から戻った時に、qのサイズが不明になる、
という事ですね。
func関数で、sizeも返すようにしようかなと思ったのですが、
sizeを返すのと、
qにターミネータをつけて返す(sizeは返さない)
のでは、どちらがより一般的なのでしょうか?


この投稿にコメントする

削除パスワード

No.3632

Re:どこでfree?
投稿者---REE(2005/04/01 09:31:39)


>func関数で、sizeも返すようにしようかなと思ったのですが、
>sizeを返すのと、
>qにターミネータをつけて返す(sizeは返さない)
>のでは、どちらがより一般的なのでしょうか?

今回は文字列としての結果と思われますので、ターミネータをつけて返す方が自然です。



この投稿にコメントする

削除パスワード

No.3633

Re:どこでfree?
投稿者---kaoru(2005/04/01 11:27:18)


>今回は文字列としての結果と思われますので、ターミネータをつけて返す方が自然です。

なるほど。その時によって使い分けた方が良いのですね。
ありがとうございました。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity