__ptr32, __ptr64

Microsoft spesifik

Gunakan __ptr32 untuk mewakili pointer asli pada sistem 32-bit. Gunakan __ptr64 untuk mewakili pointer asli pada sistem 64-bit.

Pengubah __ptr32 dan __ptr64 adalah ekstensi khusus Microsoft untuk skenario interop. Untuk kode standar 32-bit (x86) atau x64 standar, gunakan pointer asli, sebagai gantinya.

Contoh berikut menunjukkan cara mendeklarasikan masing-masing jenis pointer ini:

int * __ptr32 p32;
int * __ptr64 p64;

Pada sistem 32-bit, pointer yang dideklarasikan dengan __ptr64 diperlakukan sebagai pointer 32-bit dan memotong 32 bit atas dari alamat 64-bit yang ditetapkan untuk itu. Pada sistem 64-bit, pointer yang dideklarasikan dengan __ptr32 diperlakukan sebagai pointer 32-bit dan memotong 32 bit atas dari alamat 64-bit yang ditetapkan untuk itu. Pemotongan ini dapat menyebabkan penunjuk yang tidak valid jika alamat 64-bit di atas 4GB.

Catatan

Anda tidak dapat menggunakan __ptr32 atau __ptr64 saat mengkompilasi dengan /clr:pure. Jika tidak, pengkompilasi menghasilkan kesalahan C2472. Opsi pengkompilasi /clr:pure dan /clr:safe tidak digunakan lagi di Microsoft Visual Studio 2015 dan tidak didukung di Microsoft Visual Studio 2017.

Untuk kompatibilitas dengan versi sebelumnya, _ptr32 dan _ptr64 merupakan sinonim untuk __ptr32 dan __ptr64 kecuali Anda menentukan opsi pengompilasi /Za (Nonaktifkan ekstensi bahasa).

Contoh

Contoh berikut menunjukkan cara mendeklarasikan dan mengalokasikan pointer dengan __ptr32 kata kunci dan __ptr64 .

Kode ini berfungsi pada x86 tetapi mungkin crash pada x64.

  • Ini berfungsi ketika dikompilasi untuk 32-bit karena __ptr64 pointer diperlakukan sebagai pointer 32-bit pada x86. Pada x86 (32-bit), malloc mengembalikan alamat 32-bit yang pas di p64.
  • Ini mungkin crash ketika dikompilasi untuk 64-bit karena pada x64, malloc mengembalikan pointer 64-bit yang dipotong menjadi 32 bit oleh baris ini: p32 = (int* __ptr32)malloc(4);. Memotong alamat 64-bit ke alamat 32-bit dapat mengakibatkan pointer yang tidak valid jika alokasi terjadi di atas 4GB. Dalam hal ini, *p32 = 32 dapat mencoba mengakses alamat terpotong yang bukan bagian dari ruang alamat proses Anda, menyebabkan pelanggaran akses. Bahkan jika berfungsi sekali, itu bisa gagal nanti jika alokator memori mengembalikan alamat yang lebih tinggi.
#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 Khusus Microsoft

Lihat juga

Jenis bawaan