• ベストアンサー

可変長のリスト

格納する文字列の長さを変えられるリストを作っているのですが、削除で困っています。 セルは、 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です。 どなたかわかるかたお願いします。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.5

>new->str = malloc(sizeof(string)+1); これですね。sizeofでは文字列の長さはわかりません。strcpyで何かが破壊されてしまったのでしょう。 new->str = malloc(strlen(string)+1);

rink-rink
質問者

お礼

ありがとうございます。うまくいきました。ずっとDeleteばかり考えていたのに、実はInsertだったのですね。今度からはもっと気をつけます。本当にありがとうございました。

その他の回答 (4)

noname#30727
noname#30727
回答No.4

pがリストの終端だとうまくいかないですが、せっかくVS.NETを使っているのですから、トレースしてみればいいのではないかと。 F5 F9 F10 F11のファンクションキーの意味だけわかっていれば、なんとかなります。

rink-rink
質問者

補足

回答を下さった皆さん、ありがとうございます。 要素の挿入は、 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)
回答No.3

#2さんがおっしゃられるように、見る限りDelete()はあっているように思われます。Delete()を呼び出すルーチンやリストの作成部分は大丈夫ですか? まれにリストの作成段階で何らかのバグがあって想定外のポインタなどが代入されている場合もあります。 あと、tmpに代入した後に値のチェックをしておいたほうが良いとは思います。pがリストの最後の場合にp->nextにはどのような値を入れているのかは知りませんが...

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

malloc や free に関連するバグは, そこだけ見てもわからないことが多いんですが.... Delete は見掛け上あっていると思うので, リストに挿入するところが間違っていないかなどを丹念に追っていくことになるんじゃないでしょうか.

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

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の次のポインタが削除されます。

関連するQ&A