Untuk benar-benar memahami mengapa pointer penting, Anda perlu memahami perbedaan antara alokasi tumpukan dan alokasi tumpukan.
Berikut ini adalah contoh alokasi tumpukan:
struct Foo {
int bar, baz
};
void foo(void) {
struct Foo f;
}
Objek yang dialokasikan pada stack hanya ada selama durasi eksekusi fungsi saat ini. Ketika panggilan untuk foo
keluar dari ruang lingkup begitu juga variabel f
.
Satu kasus di mana ini menjadi masalah adalah ketika Anda perlu mengembalikan sesuatu selain tipe integral dari suatu fungsi (misalnya struktur Foo dari contoh di atas).
Misalnya, fungsi berikut akan menghasilkan apa yang disebut "perilaku tidak terdefinisi."
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
struct Foo f;
return &f;
}
Jika Anda ingin mengembalikan sesuatu seperti struct Foo *
dari fungsi yang benar-benar Anda butuhkan adalah alokasi tumpukan:
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
return malloc(sizeof(struct Foo));
}
Fungsi malloc
mengalokasikan objek pada heap dan mengembalikan pointer ke objek itu. Perhatikan bahwa istilah "objek" digunakan secara longgar di sini, yang berarti "sesuatu" daripada objek dalam arti pemrograman berorientasi objek.
Masa objek yang dialokasikan heap dikendalikan oleh programmer. Memori untuk objek ini akan dicadangkan sampai programmer membebaskannya, yaitu dengan menelepon free()
atau sampai program keluar.
Sunting : Saya gagal melihat pertanyaan ini ditandai sebagai pertanyaan C ++. Operator C ++ new
dan new[]
melakukan fungsi yang sama dengan malloc
. Operator delete
dan delete[]
analog dengan free
. Sementara new
dan delete
harus digunakan secara eksklusif untuk mengalokasikan dan membebaskan objek C ++, penggunaan malloc
dan free
sepenuhnya legal dalam kode C ++.