• ベストアンサー

リスト構造のソートにおいて

リスト構造のソートにおいて 下記の//■ここの( p->next )->key )が、一番最後のpになった時に p->nextが何も指していないコードだと、MFCだとエラーで落ちてしまうのですが コンソールアプリだと落ちません。(私の勘違いでなければ) そんなことが有るのでしょうか? (下記コードとは関係なしにどんなコードでも良いのですが) while ( p != NULL ) { /* キーが超えたら */ if ( ( key <= p->key && p->next == NULL ) || ( key <= p->key && key > ( p->next )->key ) ) {  //■ここ /* ポインタのつなぎ換え */ wk = p->next; p->next = new_p; new_p->next = wk; /* リストにデータを登録 */ new_p->key = key; strcpy( new_p->name, str ); return head; } p=p->next; }

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

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

p-nextがNULLで、そのメンバを参照しているわけではありません。 なぜなら、p->next==NULLならifの2つめの条件そのものが実行されないからです。 このifをコメントアウトするとエラーがなくなるというのは, コメントアウトすることにより本当はエラーが起きているにもかかわらず、 それが表にでない形になっただけかも知れません。(変数のアドレスなどがかわって) 一番、あやしいのはstrcpyの部分です。 たしかにnew_p->nameは領域が確保されているのでしょうか?

mk1234
質問者

お礼

回答ありがとう御座います。 どうも質問のしかたがまずく、話が込み入ってきたので(すみません)コード全体が載っているサイトを示します。 http://www9.plala.or.jp/sgwr-t/c/A/rei15-5.html 本当はこのサイトに質問すれば良いのですが、今はそこにはつなげない状態なので、こちらに質問しました。 このコードではリンクの一番最後のpはp->nextが何も指していなくエラーじゃないかと思ったのですが、読み間違いかな?

その他の回答 (8)

回答No.9

>なぜなら、p->next==NULLならifの2つめの条件そのものが実行されないからです。 本当ですか?それ。 if ( ( key <= p->key && p->next == NULL ) || ( key <= p->key && key > ( p->next )->key ) ) { なのに。 書き方を誤りました。 正確には 「p->next == NULL なら二つ目の&&の次は実行されない。」 です。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.8

>なぜなら、p->next==NULLならifの2つめの条件そのものが実行されないからです。 本当ですか?それ。 if ( ( key <= p->key && p->next == NULL ) || ( key <= p->key && key > ( p->next )->key ) ) { なのに。 key <= p->key && p->next == NULL が満たされない限り、or以降は判断されますけど。 キーの値が比較対象より小さく、nextがNULLなんて普通にあると思いますけど。 で、個人的にはコンソールアプリで落ちないのはたまたまだと思います。 コンパイルオプションとか変えれば落ちるんじゃないんですか?

mk1234
質問者

お礼

いつもお世話になっています。 回答ありがとうございます。 このコードは問題ないと思います。 わたしの勘違いでした。 if ( ( key <= p->key && key > ( p->next )->key ) || ( key <= p->key && p->next == NULL ) ) { if内を逆にしたこれなら落ちますが。

回答No.7

ソースコード自体には問題がないように見えます。 MFCで扱ったときに、なんらかの問題が発生したのではないでしょうか? 例えば、追加してはならない場所へこれらのコードを追加したとか……

mk1234
質問者

お礼

回答ありがとうございます。 風邪引いて頭が痛い中、仕事中にこっそりプログラムのこと考えていたのでまったく頭が回っていませんでした。 家で風呂に入ったらすぐ分かりました。 私の間違いでこのコードに問題はなく、MFCでもうまく行きました。

  • wr250zb
  • ベストアンサー率41% (7/17)
回答No.6

p->nextの指している先は、確保したデータなのでしょうか? p->nextが不定アドレスなら入っているアドレス値により たまたま死なない事はあると思いますけど。。。

mk1234
質問者

お礼

回答ありがとう御座います。 #5を参考にしてください。

回答No.4

すみません。コードをみまちがえました。p->nextはNULLじゃないんですね。

mk1234
質問者

お礼

回答ありがとう御座います。 p->nextはNULLではないのですが、プログラム全体を見ても、特になにも指定していません。 (こういう状態は何というのでしょう?) 要は初期化もしていないし、何も代入もしていません。

回答No.3

p->nextがNULLなのに、そのメンバを参照してるからじゃないですか?

mk1234
質問者

お礼

回答ありがとう御座います。 まさにおっしゃる通りだと思います。 MFCで落ちることはおかしくないのですが、コンソールアプリだと落ちないので、そういう仕様の差が有るのかが知りたいのですが。 ご存知でしたらご指導下さい。

回答No.2

no1です プログラムをよく見てみたところ、「//■ここ」と書かれた位置ではエラーが起きそうにないのですが、 この位置でエラーが起きてプログラムが終了するのでしょうか?

mk1234
質問者

お礼

「//■ここ」をコメントアウトするとエラーが起きないのでそうではないかと思うのですが。

回答No.1

MFCのエラーとはどのようなエラーなのでしょうか? 中止、続行、無視のボタンがでてくるエラーなのでしょうか?

mk1234
質問者

お礼

回答ありがとう御座います。 以下のメッセージが出ます。 問題が発生したため、abc.exe を終了します。 ご不便をおかけして申し訳ありません。

関連するQ&A

専門家に質問してみよう