2011-01-08 14 views
0

どのようにしてサイズの配列を非常に大きく作成できますか?まあ私はサイズINT_MAXの配列を作成することができません..どのようにこれを達成することができますか?非常に大きいサイズの配列の割り当て

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#define SIZE 2147483647 

int main() {  
    int *array;  
    unsigned int i; 

    array = malloc(sizeof(int) * SIZE);  
    if(array == NULL) { 
     fprintf(stderr, "Could not allocate that much memory"); 
     return 1; } 

    for(i=0; i<1; i++) { 
     array[0] = 0;  
    }  

    free(array); 
} 
+0

*サイズの配列を作成できませんINT_MAX * - あなたのコードが行っていることではありません。 sizeof(int)* INT_MAXの配列を作成しようとしています。 –

答えて

0

最小4GBのサイズのアレイを作成しています。あまりにも多くの空きメモリがありますか?

+2

空きメモリより重要なのはアドレススペースです。あなたのマシンが配列の特定のインデックスにアクセスするのに十分なビット数を持っていない場合は、空きメモリが十分にあるかどうかは関係ありません。 –

+0

Zachさん、ありがとうございます –

+0

しかし、十分なアドレス空間がない場合、OSが十分な空き領域を認識しないことを意味しません。私たちの答えは同じではありませんか?私は "...そのアドレス可能な空きメモリ"を置くべきかもしれない。 –

5

あなたはほぼ確実にプラットフォームの制限に当たっています。 32ビットのアドレス空間しか持たない場合でも、4Gはあなたが対応したいと思う程度です。実際には、アドレス空間の一部が他のものに取り込まれるため、ずっと少なくなります。

64ビットのアドレス空間では、それが可能かもしれませんが、その割り当てレベルになると、実際に必要かどうかを尋ねる必要があります。

問題を解決する方法は、ディスクなどのメモリ不足のストレージを使用して、必要なものだけをメモリに持ち込むことです。

つまり、データ構造を(たとえば)1Mチャンクに分割し、一度に1M単位で処理します。

データ構造の使用パターンに応じてこれを効率的に実行するために使用できるキャッシュアルゴリズムはたくさんあります。

たとえば、真にシーケンシャルなアクセスの場合、一度に1つのチャンクをメモリに格納できます。真のランダムアクセスのために、キャッシュシナリオで一度に複数のチャンクをメモリに格納したい場合があります。それぞれのメモリ内構造は1Mのデータとそのメモリの場所をLRUアルゴリズムを使用できるようにメモリの両方に格納しますダーティデータのライトバックなどが含まれます。

1

最初の問題は割り当て自体ではなく、一見単純な表現sizeof(int) * SIZEです。 intが4バイトの場合、その操作の結果は0x1FFFFFFFCです。これには33ビットが必要です。あなたのプラットフォームがsize_tタイプの32ビットしかない場合、乗算の結果は(size_tは符号なしです)0xFFFFFFFCになります。

上記の33ビットの値をmallocの呼び出しで使用したことがあった場合、コンパイラはおそらくその数値が表現可能ではないことを伝えていたでしょう。

+1

size_tは符号なしタイプなので、結果は "未定義"ではなく、size_tのビット数に切り捨てられます。 mallocが成功する可能性はあるものの、期待されているよりもサイズが小さくなりますが、必要以上に小さなメモリが返されます。 – Secure

+0

@Secure:right!私はそれに応じて私の答えを変更します。 –

-1

これまでのところ、誰もあなたの質問に答えようとしていますが、私は別の方法をとってみたいと思います。私の経験では、実際に割り当てようとしているタイプ/サイズの配列が必要であることは稀です。このような巨大な構造(配列、スタック、キュー、マップの解析)を作成しなければ、必要な作業を行う方法は他にもたくさんあります。

私はこの配列で何をしたいのですか? 。 。あなたが解決しようとしていた問題を理解していれば、実際にはそれが必要ないと私は賭けています。

一方、これが知的運動であれば(私がどれくらいの大きさを割り当てることができるかなど)、そのような質問にも答える方法があります。

再生したい場合。 。 。あなたが実際に達成しようとしていることは何ですか?

+0

そして2番目の質問です。 。 。なぜC?なぜC#またはC++か他の多くの言語ではないでしょうか。私は間違ってはいけません.CerniganとRitchieがそれについて書いているところでC言語を書くときにたくさんのお金をかけたとき、Cを学びました。 。 。しかし、私たちのほとんどは移動しました。 。 。なぜこの問題はCですか? – Frank

+0

仮定が普遍的に適用されないという証拠が示唆されたとき、ニュートン力学を学ぶのはなぜですか?いくつかの用途では、システムがシンプルであることがあります。時にはそれが有効であることがあるため、新しいアプローチがうまく機能し、他のアプリケーションでは非常に悪いために、 –

+0

そうだけど、私はこの男に関わって、彼の問題と彼の解空間についてもっと明らかにするようにしている。私が言ったように、Cは素晴らしい言語です。あなたが指摘しているように、それは簡単で簡単に学ぶことができます。それはここの目標ですか?問題の下で「本当の問題」とは何ですか?私はこれが整数の大きな配列を作成することではないと推測しています。ユーザーは何かを達成しようとしています。 。 。それは何ですか? – Frank

関連する問題