パテを使用している場合、あなたのLinuxサーバへのSSH接続があり、そのLinuxシステムでコードをコンパイルしています。
あなたのシェルがBASH
ならば、私はulimit -a
がstacksize
を含むすべてのメモリ制限を明らかにすると信じています。シェルがcsh
またはtcsh
の場合は、プロンプトでlimit
と入力して、値を制限値に表示します。 echo $SHELL
を実行することによって、あなたのシェルがどのタイプであるかを見ることができます。
私はSUSEを使用していますが、これらの設定は/etc/security/limits.conf
にあります。 stacksize
にあるデフォルトの8MBを調整することができます。 SUSE/SLES 10.1以来、私はスタックサイズのデフォルトの制限が8MBであることを経験しました。なぜ彼らはそれを8MBに設定し、どのようなセキュリティの影響があるのか分かりません。何年もの間、limits.conf
をstacksize
に設定してunlimited
に変更しましたが、問題は一度もありませんでした。 このファイル名と場所が他のすべてのディストリビューションに当てはまるか、あるいは8MBが他のディストリビューションのデフォルトのスタックサイズ制限であるかはわかりません。
他の人は、大きな配列変数がmain()
で宣言されていて、プログラムを実行するときにスタック上に配置されるため、他の関数内で問題の原因となっていると言いました。 Linuxオペレーティングシステムがハード/ソフトの制限を8MBに設定している場合は、スタックに8MB以上のメモリを必要とするプログラムを実行する=失敗する。
私は何年にもわたってLinuxでコードを実行していますが、何も問題なくコンパイルしてから実行してください。説明がなくて終了するかクラッシュするようです。オペレーティングシステムによってスタックサイズに制限されます。 stacksizeをunlimitedにすばやく変更すると、プログラムが完了するまで実行された場合にそれが原因かどうかが確認されます。
これをすばやく回避するには、.c
または.cpp
ファイルのmain()の外部にある大きな変数を宣言します。これが良いプログラミングかどうかは別の問題です。
linuxで自由度が増し、gccコンパイラでは、stacksizeに設定されたハード/ソフト制限を超える宣言された変数をチェックしたり告げることなく、コードをコンパイルできるようになります。宣言された変数がstacksizeの値を超えた場合、gcc、g ++、またはgfortranがコンパイル時にチェックするコンパイラオプションがあるかどうかはわかりません。宣言された変数が使用するメモリの量は、常に整数であれば、int myarray[700]
なら2800バイト、int myarray[700][700]
は1.869MBで1,960,000バイトです。
Microsoft Windowsでスタックサイズのデフォルト制限がわかっていません(それは1MBであると言われています)。しかし、Visual Studio(これはよく知られていません)ではチェックしても驚かないでしょうコンパイル時に、宣言された変数がオペレーティングシステムによってスタックサイズに設定された制限を超えた場合。
出典
2017-01-27 04:36:19
ron
はい、sshでマシンにアクセスすると、そのマシンでコマンドを実行できます。その場合、あなたのコードはあなたの大学のコンピュータでコンパイルされます。あるシステムでエラーが発生する実際の理由は、コード内で未定義の動作が原因である可能性があります。つまり、おそらく間違っていると思われます。 –
スケルトンでは、このタイプのパラメータを持つすべての関数を変更することが許可されています(変更は許可されていないため): void(int image [700] [700]) 私は、 (関数ヘッダ内の)スタック上に大きな配列を定義した結果、それが私のウィンドウ上でローカルにコンパイルされず、私の大学のLinuxを通してコンパイルされます。スタックサイズの違いが原因です。 –
Visual Studioにはどのようなエラーがありますか? –