- ベストアンサー
C言語での配列初期化について
int a ,b; int wk[100][100]; for(a = 0 ; a < 100 ; a++){ for(b = 0 ; b < 100 ; b++){ wk[a][b] = 0; } } を行うと、処理がフリーズしてしまいます。 wk[a][b] の行を外すとフリーズは起こらなくなるようです。 printfで中身がどこで止まっているかを調べて見ましたが、 aは0のままで、bは80くらいまでは動いているようです。 コンパイラはlccを使用しています。 原因のわかる方、教えていただけないでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
DOSならメモリモデルで扱えるデータの大きさに制限がある場合があります。 昔のCPUやDOSではメモリをセグメント単位で管理していたからですね。 100×100は1万で、これにint型のバイト長を掛けますから、思ったよりもデータサイズは大きいんです。実際にsizeofで配列のデータの大きさを確認して見て下さい。 それに他の変数やスタック領域など、全てのデータ領域の合計が上限の64KBをオーバーしているんじゃないかと思います。(普通はエラーや警告などが出ると思うのだけど?) それで実行途中でスタックが破壊されて暴走しているのだと推測します。 対処方法としては、一度に大量のメモリを使わない様にプログラムを変えるか、より大きいメモリモデルに変更するかですね。 タイニーモデル:データとコード(プログラム)を合わせて64KB以内 ※DOSの実行ファイルの.COMはこのメモリモデルです。 スモールモデル:データは64KB以内、コード64KB以内 ミディアムモデル:データは64KB以内、コード64KB以上 コンパクトモデル:データは64KB以上、コード64KB以内 ラージモデル:データは64KB以上、コード64KB以上 LSI-Cがもしフリーの試食版ならスモールモデルしか使えなかった筈です。
その他の回答 (5)
- higeG
- ベストアンサー率22% (4/18)
int wk[100][100]; の前にstatic を付けてみてください。
- yama5140
- ベストアンサー率54% (136/250)
>原因のわかる方、教えていただけないでしょうか。 マニュアルも解凍しましたよね。 3.3 データの内部表現 3.9 スタックの大きさ スタックの大きさは、標準ではSモデルとPモデルでは2500バイト、DモデルとLモ デルでは 5000 バイトになっています。LSI C-86で作成したプログラムの実行に は、最低でもこの大きさのスタックが必要です。 また、 49 ページ -kX リンカにオプションXを渡します。たとえば、 スタックの大きさを設定 するにはこのオプションを使い、 以下のようにします。 lcc foo.c -k'-s 5000' なども参照し、扱う値が -128 127 の範囲内だったら char に変えるとか、 いろいろ試して下さい。
- yama1718
- ベストアンサー率41% (670/1618)
前の回答に補足します。 質問のようにプログラムすると、配列はスタック領域にローカル変数として確保されます。 確かデフォルトではスタック領域は数KBしか確保していなかったと思います。 スモールモデルのまま動かせるかもしれない方法は、 リンカのオプションで通常よりもスタック領域を大きく確保するように設定するか、 配列をグローバル変数にすれば動くかもしれませんね。 根本的にはDOS時代のLSI-Cを使い続けるよりも、VCなどもっとマシな開発環境を使ったらと思いますけどね。
- Tacosan
- ベストアンサー率23% (3656/15482)
「DOS上」ということだと, この wk を局所変数にしていたら (スタックがあふれて) 動かないかもしれない... かな? なぜいまどき LSI-C なのか, 理解に苦しむけど.
- Tacosan
- ベストアンサー率23% (3656/15482)
一口に「lcc」といってもいくつか種類があるようです. あなたはどのようなシステムでどの「lcc」を使っているのですか?
補足
コンパイラはLSI C-86のもので、 DOS上でコンパイルを行っています。