Microsoft專屬
用於 __ptr32 表示 32 位元系統上的原生指標。 用於 __ptr64 表示 64 位元系統上的原生指標。
__ptr32和 __ptr64 修飾符是 Microsoft 專用的互操作情境擴充功能。 對於標準 32 位元(x86)或標準 x64 程式碼,請使用原生指標。
下列範例將示範如何宣告每一個這些類型的指標:
int * __ptr32 p32;
int * __ptr64 p64;
在 32 位元系統中,宣告 的 __ptr64 指標被視為 32 位元指標,並截斷任何 64 位元位址的上方 32 位元。 在 64 位元系統中,宣告 的 __ptr32 指標被視為 32 位元指標,並截斷任何分配給它的 64 位元位址的上方 32 位元。 若 64 位元位址超過 4GB,這種截斷可能導致指標無效。
注意
你無法使用 __ptr32 或 __ptr64 在編譯時使用 /clr:pure。 否則,編譯器會產生錯誤 C2472。
/clr:pure 與 /clr:safe 編譯器選項在 Microsoft Visual Studio 2015 中已被棄用,且在 Microsoft Visual Studio 2017 中不支援。
為了與先前版本相容,_ptr32且_ptr64是 和 __ptr64 的同義詞__ptr32,除非你指定編譯器選項 /Za(Disable language extensions)。
範例
下列範例示範如何使用 和 __ptr32 關鍵詞來宣告和配置指標__ptr64。
這段程式碼在 x86 上可用,但在 x64 上可能會當機。
- 當它編譯為 32 位元時是可行的,因為
__ptr64指標在 x86 上被視為 32 位元指標。 在 x86(32 位元)上,回malloc傳一個 32 位元位址,該位址屬於p64。 - 在為 64 位元編譯時可能會當機,因為在 x64 上,回
malloc傳一個 64 位元指標,且該指標被以下行截斷為 32 位元:p32 = (int* __ptr32)malloc(4);。 將 64 位元位址截斷為 32 位元位址,若配置超過 4GB,指標可能會無效。 在這種情況下,*p32 = 32可能會嘗試存取一個不屬於你程序位址空間的截斷位址,導致存取違規。 即使成功一次,若記憶體分配器回傳較高位址,之後也可能失敗。
#include <cstdlib>
#include <iostream>
int main()
{
using namespace std;
int* __ptr32 p32;
int* __ptr64 p64;
p64 = (int* __ptr64)malloc(4);
*p64 = 64; // Works on x86 and x64
cout << *p64 << endl;
p32 = (int* __ptr32)malloc(4);
*p32 = 32; // Works on x86. Possible exception on x64
cout << *p32 << endl;
}
64
32
END Microsoft 特定的