サイズが 78719476736 バイトの配列があるとします。この配列は、C コードで malloc を使用して動的に割り当てられることに注意してください。この量のメモリを割り当てた後、malloc が有効なポインタを返すと仮定します。この配列のサイズは UINT_MAX(4294967295) を超えています。つまり、unsigned int(32 ビット) の最大制限です。
私のコードが以下のように見えると仮定します。
int *buf;
buf = (int*)malloc(78719476736);
ここで、78719476736 は 4 * UINT_MAX より大きいです。
buf のすべての要素を参照する必要がある場合、buf は int* であるため 32 ビットになるため、malloc(78719476736 バイト) を使用して割り当てたすべてのメモリ要素をアドレス指定することはできません。
私の質問は、上記のコードを変更して buf を long long (64 ビット変数) にするべきではないということです。long long 変数だけが、割り当てた大きなメモリをアドレス指定できるからです。
コードの変更例
unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);
実際、ポインタは 32 ビット幅になり、78719476736 バイトにアクセスできなくなるため、変数 buf はもはやポインタであってはなりません。
したがって、これは単純な unsigned long long int である必要があり、上記の変更されたコードに示されているように、malloc の戻りポインター値を unsigned long long int にキャストし、buf を使用して割り当てられたすべての要素にアクセスする必要があります。
上記の私の仮定は正しいですか?
また
私は混乱していますか/何かが欠けていますか?
編集:それが役立つ場合は、
Intel Core 2 Duo (64 ビット CPU) で WinXP を搭載したデスクトップで作業しています。したがって、CPU に関しては、4 GB を超えるアドレス空間にアクセスしても問題はありません。64 ビットをサポートするために有効にする必要がある他のすべてのコンポーネント、つまり
a.) コンパイル中に 64 ビットのコンパイラ サポートを有効にする方法を教えてください (私は Visual Studio 2005 Professional エディションを使用しています)。
b.) 64 ビットの OS サポート - Windows XP Professional を使用しています。
ありがとうございました。
-広告。