Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
__ptr64Zeiger auf x86 als 32-Bit-Zeiger behandelt werden. Bei x86 (32-Bit)mallocwird eine 32-Bit-Adresse zurückgegeben, die inp64das Element passt. - Es kann abstürzen, wenn sie für 64-Bit kompiliert wird, da auf x64 ein 64-Bit-Zeiger zurückgegeben wird,
mallocder 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 = 32die 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