- ベストアンサー
可変長のリスト
格納する文字列の長さを変えられるリストを作っているのですが、削除で困っています。 セルは、 typedef struct cell { char *str; struct cell *next; } CELL, *pCELL; で定義してあります。この上で、 void Delete(pCELL p) { pCELL tmp; char *ad; tmp = p->next; ad = tmp->str; p->next = tmp->next; free(tmp); free(ad); } を使ってposの次のセルを削除したいのですがうまくいきません。ビルドはできるのですが、実行するとエラーがでます。 エラーメッセージはDAMAGR:after Normal block (#46) at 0x003710F0です。 動作環境は、XPでVS.NETです。 どなたかわかるかたお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>new->str = malloc(sizeof(string)+1); これですね。sizeofでは文字列の長さはわかりません。strcpyで何かが破壊されてしまったのでしょう。 new->str = malloc(strlen(string)+1);
その他の回答 (4)
pがリストの終端だとうまくいかないですが、せっかくVS.NETを使っているのですから、トレースしてみればいいのではないかと。 F5 F9 F10 F11のファンクションキーの意味だけわかっていれば、なんとかなります。
補足
回答を下さった皆さん、ありがとうございます。 要素の挿入は、 pCELL Insert(pCELL p, const char *string) { pCELL new; new = calloc(1,sizeof(CELL)); if (new != NULL) { new->str = malloc(sizeof(string)+1); strcpy(new->str,string); new->next = p->next; p->next = new; } return new; } を使っています(pの指すセルの後ろに新しいセルを挿入するとして)。 トレースをしてたら、free(ad) でエラーがでてるみたいですが依然として理由は不明です・・・。
- yosi_yosi
- ベストアンサー率35% (165/468)
#2さんがおっしゃられるように、見る限りDelete()はあっているように思われます。Delete()を呼び出すルーチンやリストの作成部分は大丈夫ですか? まれにリストの作成段階で何らかのバグがあって想定外のポインタなどが代入されている場合もあります。 あと、tmpに代入した後に値のチェックをしておいたほうが良いとは思います。pがリストの最後の場合にp->nextにはどのような値を入れているのかは知りませんが...
- Tacosan
- ベストアンサー率23% (3656/15482)
malloc や free に関連するバグは, そこだけ見てもわからないことが多いんですが.... Delete は見掛け上あっていると思うので, リストに挿入するところが間違っていないかなどを丹念に追っていくことになるんじゃないでしょうか.
- nitscape
- ベストアンサー率30% (275/909)
p->next = tmp->next; の部分が意味的に... p->next = p->next; となっているからだと思います。 このような形では、変更するべきnextポインタをどうするかが問題になるなるので、どういう風に作るのがベストなのか分かりませんが... void Delete(pCELL p) { p->next = (p->next)->next; free((p->next)->str)); free(p->next); } とすればどうでしょうか?この場合はpの次のポインタが削除されます。
お礼
ありがとうございます。うまくいきました。ずっとDeleteばかり考えていたのに、実はInsertだったのですね。今度からはもっと気をつけます。本当にありがとうございました。