いちばん失敗した人決定戦

文字列の左右のスペースを削除する関数を作っています。
そこで引数の文字列と同じ領域のメモリを確保し、そこで一時的にスペースを削除する作業をしています。
作業が終わったら、引数のポインタに文字列をコピーし、作業領域を解放したいと思っています。
しかし、確保した領域を解放しようとすると、「セグメンテーション違反」なるエラーが出て、解放できません。どなたか分かる方ご教授お願いします。

void trim(char *str)
{
int i;
int len;

char *tmp_p, *save_p;
tmp_p = (char *)malloc(strlen(str) + 1);

strcpy(tmp_p, str);
save_p = tmp_p;
len = strlen(tmp_p);

// 後方スペース削除
// ポインタを最後まで進める
for(i = 0; i < len - 1; i++)
{
tmp_p++;
}

// 文字だった場合'\0'でターミネート
while(tmp_p != save_p)
{
if(!isspace(*tmp_p))
{
tmp_p++;
*tmp_p = '\0';
break;
}
tmp_p--;
}

// 前方スペース削除
// ポインタを最初に戻す
tmp_p = save_p;

// 文字が出てくるまでポインタを進める
while(isspace(*tmp_p)) tmp_p++;

strcpy(str, tmp_p);
//free(tmp_p); // <- セグメンテーション違反
}

A 回答 (3件)

free(save_p);


とすればいいですが、基本的にこういう書き方は紛らわしいですよね。
以下のようにするのが間違いが少ない書き方だと思います。
(save_pは取得値を保持し、tmp_pはワーク用とする)

char *tmp_p, *save_p;
save_p = (char *)malloc(strlen(str) + 1);
strcpy(save_p, str);
tmp_p=save_p;
(以下、そのまま)
free(save_p);
    • good
    • 0
この回答へのお礼

そうですね。確かに紛らわしいです。
ご指摘の通り修正したほうがいいですね。
早速修正したいと思います。
ご回答ありがとうございました。

お礼日時:2003/11/12 13:30

while(isspace(*tmp_p)) tmp_p++;


が犯人です

tmp_p = save_p;
free(tmp_p);

とすれば大丈夫ですけど・・・
    • good
    • 0
この回答へのお礼

確かにご指摘の箇所が犯人でした。
ポインタが進んだままになっていました。。。
ご回答ありがとうございました。

お礼日時:2003/11/12 13:27

free時点でtmp_pはmallocした時のアドレスを指しているのでしょうか?

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

早速のご回答ありがとうございます。
ご指摘のとおりfree時点ではmallocのアドレスは
さしておりません。
それが原因でしたか。気がつきませんでした。
ありがとうございます。

お礼日時:2003/11/12 13:17

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