- ベストアンサー
メモリの解放について
文字列の左右のスペースを削除する関数を作っています。 そこで引数の文字列と同じ領域のメモリを確保し、そこで一時的にスペースを削除する作業をしています。 作業が終わったら、引数のポインタに文字列をコピーし、作業領域を解放したいと思っています。 しかし、確保した領域を解放しようとすると、「セグメンテーション違反」なるエラーが出て、解放できません。どなたか分かる方ご教授お願いします。 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); // <- セグメンテーション違反 }
- みんなの回答 (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);
その他の回答 (2)
- nagare
- ベストアンサー率33% (280/831)
while(isspace(*tmp_p)) tmp_p++; が犯人です tmp_p = save_p; free(tmp_p); とすれば大丈夫ですけど・・・
お礼
確かにご指摘の箇所が犯人でした。 ポインタが進んだままになっていました。。。 ご回答ありがとうございました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
free時点でtmp_pはmallocした時のアドレスを指しているのでしょうか?
お礼
早速のご回答ありがとうございます。 ご指摘のとおりfree時点ではmallocのアドレスは さしておりません。 それが原因でしたか。気がつきませんでした。 ありがとうございます。
お礼
そうですね。確かに紛らわしいです。 ご指摘の通り修正したほうがいいですね。 早速修正したいと思います。 ご回答ありがとうございました。