Menguasai Kode Tidak Aman C#: Panduan Pointer dan Manajemen Memori
C# memungkinkan penggunaan variabel pointer dalam fungsi atau blok kode ketika ditandai dengan modifikasi unsafe. Kode tidak aman atau kode tidak terkelola adalah blok kode yang menggunakan variabel pointer.
Pointer
Sebuah pointer adalah variabel yang nilainya adalah alamat dari variabel lain, yaitu alamat langsung dari lokasi memori. Mirip dengan variabel atau konstanta lainnya, Anda harus mendeklarasikan pointer sebelum dapat menggunakannya untuk menyimpan alamat variabel apa pun.
Bentuk umum deklarasi pointer adalah −
type *var-name;
Berikut adalah deklarasi pointer yang valid −
int *ip; /* pointer to an integer */ double *dp; /* pointer to a double */ float *fp; /* pointer to a float */ char *ch /* pointer to a character */
Contoh berikut menunjukkan penggunaan pointer dalam C#, menggunakan modifikasi unsafe −
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} ", var); Console.WriteLine("Address is: {0}", (int)p); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Data is: 20 Address is: 99215364
Alih-alih mendeklarasikan seluruh metode sebagai tidak aman, Anda juga dapat mendeklarasikan sebagian kode sebagai tidak aman. Contoh dalam bagian berikut menunjukkan ini.
Mengambil Nilai Data Menggunakan Pointer
Anda dapat mengambil data yang disimpan di lokasi yang dirujuk oleh variabel pointer, menggunakan metode ToString(). Contoh berikut menunjukkan ini −
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} " , var); Console.WriteLine("Data is: {0} " , p->ToString()); Console.WriteLine("Address is: {0} " , (int)p); } Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Data is: 20 Data is: 20 Address is: 77128984
Meneruskan Pointer sebagai Parameter ke Metode
Anda dapat meneruskan variabel pointer ke metode sebagai parameter. Contoh berikut menunjukkan ini −
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10
Mengakses Elemen Array Menggunakan Pointer
Dalam C#, nama array dan pointer ke tipe data yang sama dengan data array, bukan tipe variabel yang sama. Misalnya, int *p dan int[] p, bukan tipe yang sama. Anda dapat meningkatkan variabel pointer p karena tidak tetap dalam memori, tetapi alamat array tetap dalam memori, dan Anda tidak dapat meningkatkannya.
Oleh karena itu, jika Anda perlu mengakses data array menggunakan variabel pointer, seperti yang dilakukan secara tradisional dalam C, atau C++, Anda perlu tetapkan pointer menggunakan kata kunci fixed.
Contoh berikut menunjukkan ini −
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* let us have array address in pointer */ for ( int i = 0; i < 3; i++) { Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i)); Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i)); } Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Address of list[0] = 31627168 Value of list[0] = 10 Address of list[1] = 31627172 Value of list[1] = 100 Address of list[2] = 31627176 Value of list[2] = 200
Mengompilasi Kode Tidak Aman
Untuk mengompilasi kode tidak aman, Anda harus menentukan opsi baris perintah /unsafe dengan compiler baris perintah.
Misalnya, untuk mengompilasi program bernama prog1.cs yang berisi kode tidak aman, dari baris perintah, berikan perintah −
csc /unsafe prog1.cs
Jika Anda menggunakan Visual Studio IDE, Anda perlu mengaktifkan penggunaan kode tidak aman dalam properti proyek.
Untuk melakukan ini −