• ベストアンサー

メモリの解放について

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

質問者が選んだベストアンサー

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.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);

negi-bozu
質問者

お礼

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

その他の回答 (2)

  • nagare
  • ベストアンサー率33% (280/831)
回答No.2

while(isspace(*tmp_p)) tmp_p++; が犯人です tmp_p = save_p; free(tmp_p); とすれば大丈夫ですけど・・・

negi-bozu
質問者

お礼

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

回答No.1

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

negi-bozu
質問者

お礼

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

関連するQ&A