void simpan_siswa(siswa* s);
Untuk bisa melakukan pemanggilan prosedur tersebut kita punya paling tidak dua kemungkinan kode yang dapat lolos kompilasi:
1. menggunakan address of value
void proses_siswa(...) {
siswa sw;
...
simpan_siswa(&sw);
}
2. menggunakan pointer
void proses_siswa(...) {
siswa* sw_ptr;
.../* ada malloc utk alokasi siswa */
simpan_siswa(sw_ptr);
}
Sebelum menjelaskan mengapa kode mana yang benar, ada beberapa hal yang perlu diketahui tentang pointer, antara lain alokasi statik, stack, alokasi dinamik, heap, scope, dan lifetime. Selain itu juga semantik/maksud/arti dari siswa* s pada prosedur void simpan_siswa(siswa* s);
Variabel yang dialokasikan secara statik, seperti variable sw di kode 1, akan disimpan di stack dan mempunyai lifetime selama masih dalam scopenya (yaitu dalam prosedur proses_siswa). Jadi address yang ditunjuk oleh &sw adalah alamat di stack yang akan segera dihapus begitu keluar dari prosedur proses_siswa.
Variabel yang dialokasikan secara dinamik, seperti variable sw_ptr di kode 2, akan disimpan di heap dan mempunyai lifetime selama masih belum di-free, bahkan diluar scopenya (walau scopenya hanya dalam prosedur proses_siswa tapi lifetimenya masih berlaku diluar prosedur tadi).
Semantik siswa* s pada prosedur void simpan_siswa(siswa* s); biasanya adalah entitas siswa yang berbeda-beda yang kemudian disimpan dalam suatu struktur (sebut saja list_siswa) yang dapat diakses dari seluruh sistem. (Bayangkan akan disimpan di suatu list yang tersimpan di memori, bukan dalam basisdata external). Jika menggunakan kode 1, maka jelas akan salah, karena siswa* akan menunjuk ke satu entitas saja dan nilainya akan hilang ketika keluar dari prosedur proses_siswa.
Simpulan:
Semantik deklarasi type* var biasanya dimaksudkan untuk menunjuk ke suatu entitas, sehingga pemanggilan yang tepat adalah dengan menunjukkan alamat di heap(seperti kode 2 yang dibuat dengan malloc).
Semantik deklarasi type* var biasanya dimaksudkan untuk menunjuk ke suatu entitas, sehingga pemanggilan yang tepat adalah dengan menunjukkan alamat di heap(seperti kode 2 yang dibuat dengan malloc).
Tidak ada komentar:
Posting Komentar