web-dev-qa-db-ja.com

Visual Studioでスタックサイズの問題を克服する方法(大きな配列でCコードを実行する)

Visual Studio13を使用してcコードを初めてコンパイルします。コードは完全に正常に実行されます。サイズ64 * 64の2次元配列(私のプログラムにはいくつかの配列があります)ですが、配列サイズを128 * 128に増やすと、実行されません(ただし正しくコンパイルされます)。代わりに、「。exeが機能しなくなりました」というメッセージが表示されます。私のマシンには4GBのRAMがあり、Linuxからコードを実行すると、同じプログラムが128 * 128配列で実行されます。

もう少し詳しく説明します。同じマシンでIntelCコンパイラ(非商用バージョン)を使用して、Linuxから同じコードを実行しました。しかし、いくつかの問題のために、私は現在、Windows環境からの作業に制約されています。 2つのc-コンパイラ(1)Visual Studio 13と(2)Borland Cを検索してインストールしました。どちらも、小さな配列でうまく機能します。しかし、配列サイズを大きくすると、VisualStudioに「.exeが機能しなくなりました」というメッセージが表示されます。 「DevelopersCommandPromptVS13」の「cl」を使用してプログラムをコンパイルします。

問題はスタックサイズにあると思います。

リンクで 詳細な説明 (以下に提供)スタックサイズを増やすためにLinux環境で使用されるコマンド「ulimit」を見ました。数年前に使ったのを覚えています。

解決策に近づいているように感じますが、dumpbin /headers executable_fileまたはeditbin /STACK:sizeの実行に失敗したため、Windows(およびVS 2013)に関する問題が解決しません。実はどうやって実行したらいいのかわからない気がします。 「DeveloperCommandPrompt VS 13」から実行するとともに、実行(windows start bottom-> search(run)-> Run(prop up))を使用して実行しようとしました。可能であれば、詳細をお知らせください。

私はこのウェブサイトを検索して見つけました、そしてここで解決策が見つかると思います。

助けてください。 WindowsのVisualStudio13を使用して実行したい。

8
user3129690

この背後にある理由は、スタックオーバーフローにあるようです。この問題は、スタックサイズを増やすことで解決できます。
Visual Studioでは、/STACK:reserve[,commit]を使用してこれを行うことができます。 MSDNの記事 を読んでください。


詳細 詳細な説明

Windowsプラットフォームでは、スタックサイズ情報は実行可能ファイルに含まれています。 Visual Studio C++でのコンパイル中に設定できます。
または、Microsoftは、実行可能ファイルを直接変更できるプログラムeditbin.exeを提供しています。詳細は次のとおりです。

Windows(コンパイル中):

  1. Project->Settingを選択します。
  2. Linkページを選択します。
  3. Category to Outputを選択します。
  4. Reserve:の下のStack allocationsフィールドに希望のスタックサイズを入力します。たとえば、10進数の32768または16進数の0x20000

Windows(実行可能ファイルを変更するため):

Microsoft Visual Studioには、dumpbin.exeeditbin.exeの2つのプログラムが含まれています。 dumpbin /headers executable_fileを実行すると、size of stack reserveの情報がoptional header valuesに表示されます。 editbin /STACK:sizeを実行して、デフォルトのスタックサイズを変更します。

12
haccks

Visual Studioが機能しませんか?

私はVSを有効な開発ツールとは考えていませんが、それがあなたの問題を引き起こすのではないかと私は強く疑っています。

128 * 128は16384です。スタックスペースが少なすぎる場合(Windowsでは、誤解しない限り、デフォルトで1MBです)、eの配列を定義します。 g。十分な大きさのstructs(64バイトのサイズ、より正確には)の場合、自動配列は通常(必ずしもそうとは限りませんが)スタックに割り当てられます。

1
user529758

スタック上で大きな配列を宣言しようとしているようです。通常、スタックメモリは制限されています。あふれているようですね。

配列に静的な期間を与えることでこれを修正できます

static BigStruct arr[128][128];

または、メモリを動的に割り当てることによって

BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128);
// use arr
free(arr);
0
simonc