2012-03-08 12 views
-3

私はこのコンパイルした場合:999999999セルの配列を割り当てます。 C++

long double *N; 

N = new long double[999999999]; 

を、私はこのエラーを取得する:

error C2148: total size of array must not exceed 0x7fffffff bytes 

だから、私はこれをコンパイルしてみました:

long double *N; 
long double *N2; 

N = new long double[999999999]; 
N2 = N + 99999999; 
N2 = new long double[900000000]; 

私はまだプログラムを実行していませんでした、しかし私は確かに私がheap corruption detectedエラーを取得すると確信しています。なぜなら、Nでナビゲートしたいし、特定のポイントでN2でナビゲートしたくないからです。

1つのポインタでこれを行うのはなぜ安全ですか?

+3

あまり記憶がありますか?また、エラーC2148を取得するには、MSVCの古いバージョンを使用している必要があります。 – Mysticial

+0

私はMSVC 2008を使用しています – Jonas

+2

これはコンパイラ、アーキテクチャ(X86 32ビットまたはx86-64 64ビット?)、およびシステムに依存します。だからあなたは答えを得るためにはるかに細かいことが必要です。しかし、コンパイラはおそらく正しいでしょう:あなたのマシンに10億倍を割り当てる方法はありません(8Gバイトを食べる必要があります。十分なRAMがあるでしょうか?) –

答えて

4

999999999※sizeof(double)は7999999992バイトです。 32ビットプラットフォームでは、それは2^32バイト以上です。 32ビットアプリケーションでは、その多くのバイトに対処できません。

絶対に10億倍にする必要がある場合は、64ビットプラットフォームを使用してください。

+2

...または巨大なファイル。 –

1

64ビットプラットフォームで、メモリ割り当てをサポートするのに十分なRAMがある場合、コンパイラはエラーを生成しません。いずれかの条件が偽である場合、コンパイラはエラーまたは例外を生成し、OSおよびプロセッサでサポートされているものよりもRAM以上のメモリを割り当てる「安全な」方法はありません。

関連する問題