1

「式の整数オーバーフロー」という警告警告を表示せずに、gccにramよりも大きい符号なし整数の配列を宣言するプログラムをコンパイルさせるにはどうすればよいですか?

例えば。私は8GBのRAMを持っていて、8.5GBの配列を宣言したいです。

編集:

皆さんに感謝します。問題はデータ型ではなく、プリプロセッサのものにあることがわかりました。でもかなり時間がかかりました。:) 私が書いた

#define GIBI 1073741824
#define ARRAYSIZE 2*GIBI

そして明らかにコンパイラはそれを好まなかった。

4

4 に答える 4

5

そのエラーメッセージは、スタックが不足することを示しているわけではありませんが、そうなります。数が大きすぎてで表すことができないと言っていsize_tます。64ビットターゲット用にコンパイルしていることを確認してください。

さらに、それをしないでください。膨大な量のRAMを割り当てる必要がある場合mallocは、スタックではなく、を使用して割り当てます。または、さらに良いことに、mmap

于 2010-12-14T20:27:16.857 に答える
5

integer overflow in expressionはスタックオーバーフローではありません。これは、式の結果が、割り当てている左辺値に整数オーバーフローを引き起こしていることをGCCが検出したことを意味します。たとえば、のようなことをしようとするとmallocINT_MAX * 2その式は積分オーバーフローを引き起こします。にキャストする場合size_tは、警告が表示されないはずです。

void *myvar = malloc((size_t) INT_MAX * 2);

size_tもちろん、これはプラットフォームに依存します。また、割り当てたいブロックのサイズをビットで表すことができない場合は、オーバーフローする可能性もあります。sizeof(size_t)基本的に、割り当てたいメモリの量を表すことができ、互換性があるタイプを使用していることを確認してくださいsize_tmalloc()によると、それが期待されるものであるためstdlib.h)。

于 2010-12-14T20:30:48.507 に答える
0

これは、スタックがオーバーフローしていることを意味するのではなく、未定義動作である符号付き整数がオーバーフローする可能性のある計算を行っていることを意味している確信して"integer overflow in expression"?います。警告が参照している行を貼り付けると役立ちます。

于 2010-12-14T20:26:33.827 に答える
0

RAMよりも多くのメモリを割り当てる必要がある場合は、メモリマップトファイルについて調査することがあります。そうすれば、マシンの物理メモリについて心配する必要がなくなります(いずれにしても、8GBすべてにアクセスできるわけではありません)。

http://msdn.microsoft.com/en-us/library/dd997372.aspx

于 2010-12-14T20:31:48.933 に答える