2

以下のコードを書きます

void * ptr1 = VirtualAlloc((void*)0x70000000, 32*1024*1024, MEM_RESERVE, PAGE_READWRITE);
 void * ptr2 = VirtualAlloc((void*)0x80000000, 4*1024*1024, MEM_RESERVE, PAGE_READWRITE);

ただし、VirtualAlloc は失敗し、ptr1、ptr2 の値は常に NULL です。アドレス 0x70000000,0x80000000 を使いたいです。これらのアドレスを使用する方法を知っている人はいますか?

4

2 に答える 2

5

メモリのこの部分は、ユーザーモードアプリケーションではアクセスできません。次のMSDNページから:

ユーザーアプリケーションは、共有ヒープアドレス範囲(0x70000000〜0x7fffffff)でVirtualAllocを呼び出すことはできません。これは、ユーザーアプリケーションでは読み取り専用であり、カーネルモードでは読み取り/書き込みであるためです。

于 2012-04-13T22:28:19.030 に答える
0

要求されたメモリ ブロック内の一部のページがまだ予約 (またはコミット) されていませんか? VirtualAlloc は予約ページを予約できません。

0x70000000 と 0x80000000 が特別なのはなぜですか? フラット メモリ モデルでは、あるアドレスが他のアドレスよりも優先される理由はありません。

于 2012-04-13T22:24:08.807 に答える