• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DOSプログラムが完全に終わらないかもしれない)

DOSプログラムの終了問題とは?

このQ&Aのポイント
  • DOSプログラムが完全に終わらないかもしれない
  • C言語でコンパイルしたDOSプログラムが終了しない問題
  • コンパイルされたDOSプログラムの実行時に異常が発生する可能性

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

>どうしてそれで解決されるだろうと予測できたんですか? >このソースではstatic にすることは無意味に思えたんですが。 staticの付かない変数(自動変数)と、 付く変数(静的変数)では、 メモリ上に確保される場所が違うのです。 自動変数は大抵、「スタック」というところに取られます。 ここはアクセスしやすいのですが、量に限りがあります。 自分で書いたプログラムだけではなく、 C言語のライブラリや、 システム制御などにも使用されるので、 あまり使いすぎるとシステム全体が変になってしまうことがあります。 「スタックオーバフロー」といわれる現象です。 机の上に物を置くと便利だけど、 置きすぎるとぜんぜん作業ができなくなってしまう、といったところです。 LSI-Cは、メモリが貴重だったDOS時代のコンパイラですから、 たぶん数キロバイトしか確保してないと思います。 スタックを使い切っておかしくなったのではないか…と思いました。 (大きな配列を取るとよくあるんです) 静的変数の配列や、mallocで確保したメモリ領域は 別のところに取られるので、 スタックオーバフローの問題は起こりません。

basukento
質問者

お礼

staticは次回{}が実行された時に、前回の値が保たれ初期化されない だけだと思っていたけど、もっと他にも違いがあったということが 勉強になりました。 charが3000個程度でも、企画上の範囲を越えていたみたいです。 教えていただいたmallocでも問題が解決できました。 *pが理解できず、そこが原因だと勘違いした下のバカも 勉強になったと思います。 ありがとうございました。

その他の回答 (2)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

自動変数にあまり大きな配列をとると、 プログラムにバグが無くても動きが変になることがあります。 これは処理系によって、どれくらいだと変になるかが違い、 状況によっても違ってくるので面倒です。 LSI-CだとDOSの処理系だから、3000も配列をとると駄目かもしれませんね。 対処方法としては、 ・strを配列ではなくてmallocで取得する。 ・strをstatic charとして宣言する。(ただし、プログラムの中で この変数を何度も使うと問題があるかもしれない。 この場合はmainだから大丈夫だとは思います) のどちらかになるでしょう。 まあmallocで取った方が安全だと思います。

basukento
質問者

補足

static にしたら問題は発生しなくなりました。 どうしてそれで解決されるだろうと予測できたんですか? このソースではstatic にすることは無意味に思えたんですが。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

こんな変なコーディングは…。 >char str[2000] = "a", *p; たぶん此処でしょう。*pってどこで宣言されてるのでしょう? 宣言文だけで、実体がないですね。

関連するQ&A

専門家に質問してみよう