[C untuk Geek]=================================== by: ev1lut10n Sebelum kita mulai permainan matikan dulu ASLR : ================================= root@mywisdom-Vostro1310:/home/mywisdom/c/elf# echo 0 > /proc/sys/kernel/randomize_va_space ================================= [Pointer & Dereference Pointer] Pointer ini variabel yang merujuk ke suatu alamat memori.dari variabel lain. Pointer ini banyak dipake di suatu program 2 C, biasanya di program2 yang menggunakan linked list dan fungsi2 yang menggunakan call by reference. format dari suatu variabel pointer: ============= tipe_data *pointer_ke_alamat_variabel; ============ Untuk memahami pointer siapkan source c, kompile lalu jalankan: ================ root@mywisdom-Vostro1310:/home/mywisdom/c/elf# cat pointer.c #include int main() { int variabel=10; int *pointer_ke_alamat_variabel; pointer_ke_alamat_variabel=&variabel; printf("variabel:%d\n",variabel); printf("alamat memori variabel:%p\n",&variabel); printf("dereference pointer_ke_alamat_variabel:%d\n",*pointer_ke_alamat_variabel); printf("pointer_ke_alamat_variabel:%p\n",pointer_ke_alamat_variabel); return 0; } ================ ================== root@mywisdom-Vostro1310:/home/mywisdom/c/elf# ./pointer variabel:10 alamat memori variabel:0xbffff3fc dereference pointer_ke_alamat_variabel:10 pointer_ke_alamat_variabel:0xbffff3fc root@mywisdom-Vostro1310:/home/mywisdom/c/elf# ================== ok setelah Anda melihat tampilan hasilnya pasti langsung paham cara2 penggunaan pointer. jika belum kita akan gunakan gdb: ============= rroot@mywisdom-Vostro1310:/home/mywisdom/c/elf# gdb -q pointer Reading symbols from /home/mywisdom/c/elf/pointer...done. (gdb) l 1 #include 2 int main() 3 { 4 int variabel=10; 5 int *pointer_ke_alamat_variabel; 6 pointer_ke_alamat_variabel=&variabel; 7 printf("variabel:%d\n",variabel); 8 printf("alamat memori variabel:%p\n",&variabel); 9 printf("dereference pointer_ke_alamat_variabel:%d\n",*pointer_ke_alamat_variabel); 10 printf("pointer_ke_alamat_variabel:%p\n",pointer_ke_alamat_variabel); (gdb) l 11 12 return 0; 13 } (gdb) b 10 Breakpoint 1 at 0x804841e: file pointer.c, line 10. (gdb) run Starting program: /home/mywisdom/c/elf/pointer variabel:10 alamat memori variabel:0xbffff3ac dereference pointer_ke_alamat_variabel:10 Breakpoint 1, main () at pointer.c:10 10 printf("pointer_ke_alamat_variabel:%p\n",pointer_ke_alamat_variabel); (gdb) step pointer_ke_alamat_variabel:0xbffff3ac 12 return 0; (gdb) x/d 0xbffff3ac 0xbffff3ac: 10 (gdb) ============= dari hasil debugging kita bisa lihat alamat memori 0xbffff3ac berisi 10 dalam integer. dari hasil di atas kita simpulkan: printf("variabel:%d\n",variabel); &variabel merupakan alamat memori variabel yang isinya 10 di mana sebelumnya kita deklarasikan suatu pointer bertipe data integer int *pointer_ke_alamat_variabel; kemudian kita buat pointer merujuk ke alamat memori dari variabel yaitu: 0xbffff3ac (dengan operator & sebelum variabel) pointer_ke_alamat_variabel=&variabel; Dereference ?? Dereference merupakan pengambilan nilai suatu alamat memori dengan menggunakan pointer yang telah kita siapkan. Untuk melakukan dereference dengan menggunakan tanda * di belakang pointer: ========================================================== printf("dereference pointer_ke_alamat_variabel:%d\n",*pointer_ke_alamat_variabel); ========================================================== sementara itu pointer_ke_alamat_variabel merujuk ke alamat memori :0xbffff3fc yang merupakan alamat memori variabel. ================================= printf("pointer_ke_alamat_variabel:%p\n",pointer_ke_alamat_variabel); ================================ pointer_ke_alamat_variabel akan dialokasikan di alamat yang berbeda dari alamat memori yang dialokasikan utk variabel: ================ oot@mywisdom-Vostro1310:/home/mywisdom/c/elf# gdb -q pointer2 Reading symbols from /home/mywisdom/c/elf/pointer2...done. (gdb) l 1 #include 2 int main() 3 { 4 int variabel=10; 5 int *pointer_ke_alamat_variabel; 6 pointer_ke_alamat_variabel=&variabel; 7 printf("alamat memori yang disimpan pointer_ke_alamat_variabel:%p\n",pointer_ke_alamat_variabel); 8 printf("alamat memori untuk pointer_ke_alamat_variabel:%p\n",&pointer_ke_alamat_variabel); 9 return 0; 10 } (gdb) l Line number 11 out of range; pointer2.c has 10 lines. (gdb) b 9 Breakpoint 1 at 0x8048407: file pointer2.c, line 9. (gdb) run Starting program: /home/mywisdom/c/elf/pointer2 alamat memori yang disimpan pointer_ke_alamat_variabel:0xbffff3ac alamat memori untuk pointer_ke_alamat_variabel:0xbffff3a8 Breakpoint 1, main () at pointer2.c:9 9 return 0; (gdb) x/x 0xbffff3a8 0xbffff3a8: 0xbffff3ac ===================== terlihat alamat memori yang dialokasikan untuk pointer_ke_alamat_variabel adalah 0xbffff3a8 dengan isinya menyimpan alamat memori 0xbffff3ac yang merupakan alamat memori si variabel.