掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.24475

calloc関数の使いい方
投稿者---fuku(2005/12/02 19:49:19)


いつもお世話になります
少し前に質問したものの続きになるのですが
文字列から「。」をみつけてそこで改行して出力するプログラムを
作っております
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+24459
でご指導頂いてテストプログラムはできたのですが
大きな文書を扱う場合、その都度メモリを確保した方が
良いと思い、calloc関数を使ってみようと試みました

以下ソースに対して
//結果

あいうえお。
かきくけこ。
さしすせそ。

と表示された後に

DAMAGE: after normal block(#46) at 0x00371008

というエラーがでて困っています。

free(buf);
を消すとエラーが出なくなりました
しかし callocを使った後は、freeで解放するようにと
書いてあります ということは、ほかに間違った点があるのでしょうか?
よろしくおねがいします

環境はVisual Studio.net 2003
OSは Windows XP
です




#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char s[64] = {"あいうえお。かきくけこ。さしすせそ。"};

    char* buf;
    char* start = s;
    char* find;
    int  len;

    while(find = strstr( start, "。" )){
        find += 2;
        len = find - start;
        buf = (char *)calloc(len, sizeof(char));
        if(buf == NULL){
            printf("メモリ確保失敗");
            return 1;
        }
        strncpy( buf, start, len );
        buf[ len ] = '\0';
        printf( "%s\n", buf );
        start = find;
    }
    free(buf);
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:calloc関数の使いい方 24476 REE 2005/12/02 20:15:13
<子記事> Re:calloc関数の使いい方 24510 かずま 2005/12/04 01:32:25


No.24476

Re:calloc関数の使いい方
投稿者---REE(2005/12/02 20:15:13)


> buf[ len ] = '\0';

この文で、確保されていない部分に書き込んでいます。
'\0'の分のメモリも確保しておきましょう。
逆に充分確保しておけば、strncpyで'\0'も設定されますので、この文自体が不要になります。



この投稿にコメントする

削除パスワード

No.24477

Re:calloc関数の使いい方
投稿者---fuku(2005/12/02 20:22:47)


>'\0'の分のメモリも確保しておきましょう。
>逆に充分確保しておけば、strncpyで'\0'も設定されますので、この文自体が不要になります。

ご指摘ありがとうございます!
仰る通りですね
len だけでは不十分ですね
buf = (char *)calloc(len + 1, sizeof(char));

のように訂正したところ
うまく動作いたしました

ありがとうございます




この投稿にコメントする

削除パスワード

No.24479

Re:calloc関数の使いい方
投稿者---Blue(2005/12/02 20:55:34)


一応 free のタイミングや違うようですが。。

while ( /* 条件 */ )
{
   /* ここで領域確保 */
}
/* ここで領域解放 */

ループが2回以上まわると、、、



この投稿にコメントする

削除パスワード

No.24480

Re:calloc関数の使いい方
投稿者---fuku(2005/12/02 23:10:28)


>一応 free のタイミングや違うようですが。。
ということは、ループが一回終わる度に
解放するべきなんですね
確かにもっと大きな文書で実行したら
何らかのエラーが起きそうですね・・^^;

while ( /* 条件 */ )
{
   /* ここで領域確保 */
   ....
   ....
  /* ここで領域解放 */
}

という感じですね






この投稿にコメントする

削除パスワード

No.24510

Re:calloc関数の使いい方
投稿者---かずま(2005/12/04 01:32:25)


> 大きな文書を扱う場合、その都度メモリを確保した方が
> 良いと思い、calloc関数を使ってみようと試みました

なぜ、malloc を使わず、calloc を使うのですか?


この投稿にコメントする

削除パスワード

No.24511

Re:calloc関数の使いい方
投稿者---fuku(2005/12/04 12:42:32)


>なぜ、malloc を使わず、calloc を使うのですか?

勉強不足かもしれませんが
動的に「配列」を確保したい場合は
malloc ではなく calloc を使うのだと理解していたからです
もう一度、諸サイトで勉強し直してみます



この投稿にコメントする

削除パスワード

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