__ptr32, __ptr64

Microsoft-spezifisch

Wird __ptr32 verwendet, um einen nativen Zeiger auf einem 32-Bit-System darzustellen. Wird __ptr64 verwendet, um einen systemeigenen Zeiger auf einem 64-Bit-System darzustellen.

Die __ptr32 Modifizierer sind __ptr64 microsoftspezifische Erweiterungen für Interoperabilitätsszenarien. Verwenden Sie für standardmäßigen 32-Bit-Code (x86) oder standardmäßigen x64-Code stattdessen systemeigene Zeiger.

Das folgende Beispiel zeigt, wie die einzelnen Zeigertypen deklariert werden:

int * __ptr32 p32;
int * __ptr64 p64;

Auf einem 32-Bit-System wird ein mit 32-Bit deklarierter __ptr64 Zeiger als 32-Bit-Zeiger behandelt und die oberen 32 Bits einer beliebigen 64-Bit-Adresse abgeschnitten, die ihm zugewiesen ist. Auf einem 64-Bit-System wird ein mit 32-Bit deklarierter __ptr32 Zeiger als 32-Bit-Zeiger behandelt und die oberen 32 Bits einer beliebigen 64-Bit-Adresse abgeschnitten, die ihm zugewiesen ist. Diese Abkürzung kann zu einem ungültigen Zeiger führen, wenn die 64-Bit-Adresse über 4 GB liegt.

Hinweis

Sie können dies nicht verwenden __ptr32 oder __ptr64 beim Kompilieren mit /clr:pure. Andernfalls generiert der Compiler fehler C2472. Die Optionen "/clr:pure " und " /clr:safe compiler" sind in Microsoft Visual Studio 2015 veraltet und werden in Microsoft Visual Studio 2017 nicht unterstützt.

Kompatibilität mit früheren Versionen und _ptr64 Synonyme für __ptr32 und __ptr64 es sei denn, _ptr32 Sie geben compileroption /Za (Spracherweiterungen deaktivieren) an.

Beispiel

Das folgende Beispiel zeigt, wie Zeiger mit den __ptr32 und Schlüsselwörtern deklariert und __ptr64 zugewiesen werden.

Dieser Code funktioniert auf x86, kann aber auf x64 abstürzen.

  • Es funktioniert bei der Kompilierung für 32-Bit-Zeiger, da __ptr64 Zeiger auf x86 als 32-Bit-Zeiger behandelt werden. Bei x86 (32-Bit) malloc wird eine 32-Bit-Adresse zurückgegeben, die in p64das Element passt.
  • Es kann abstürzen, wenn sie für 64-Bit kompiliert wird, da auf x64 ein 64-Bit-Zeiger zurückgegeben wird, malloc der um diese Zeile auf 32 Bit abgeschnitten wird: p32 = (int* __ptr32)malloc(4);. Das Abschneiden einer 64-Bit-Adresse zu einer 32-Bit-Adresse kann zu einem ungültigen Zeiger führen, wenn die Zuordnung über 4 GB erfolgt ist. In diesem Fall könnte versucht werden, auf eine abgeschnittene Adresse zuzugreifen, *p32 = 32 die nicht Teil des Adressraums Ihres Prozesses ist, was zu einer Zugriffsverletzung führt. Auch wenn es einmal funktioniert, kann es später fehlschlagen, wenn der Speicherzuordnungs-Allocator eine höhere Adresse zurückgibt.
#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

Ende Microsoft-spezifisch

Siehe auch

Integrierte Typen