Pointer Menggantung
Bahaya penggunaan setelah free.
Pointer Menggantung adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.
Apa Itu Pointer Menggantung
Pointer menggantung menunjuk ke memori yang sudah dibebaskan atau tidak lagi valid.
Menggunakannya menyebabkan perilaku tidak terdefinisi: program dapat mengalami kerusakan, korupsi data, atau bug yang tidak terlihat.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
printf("%d\n", *p);
free(p);
p = NULL;
return 0;
}Penggunaan Setelah Dibebaskan
Penyebab yang paling umum adalah membaca atau menulis melalui pointer setelah free.
Blok tersebut mungkin sudah digunakan kembali untuk keperluan lain.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 42;
free(p);
/* Reading *p here would be use-after-free. */
p = NULL;
printf("avoided use-after-free\n");
return 0;
}Menjadikan NULL Setelah Dibebaskan
Menetapkan pointer ke NULL tepat setelah membebaskannya mengubah penggunaan yang tidak disengaja menjadi kerusakan yang jelas, atau free(NULL) yang tidak berbahaya.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *buf = malloc(10);
buf[0] = 'A';
free(buf);
buf = NULL;
if (buf == NULL) printf("buf is safely null\n");
return 0;
}Mengembalikan Alamat Lokal
Mengembalikan alamat variabel lokal (tumpukan) membuat pointer menggantung: variabel tersebut hilang saat fungsi selesai dijalankan.
Gunakan heap atau teruskan buffer sebagai gantinya.
#include <stdio.h>
#include <stdlib.h>
int *make_value(int v) {
int *p = malloc(sizeof(int));
*p = v;
return p;
}
int main(void) {
int *p = make_value(99);
printf("%d\n", *p);
free(p);
return 0;
}Beberapa Pointer ke Satu Blok
Jika dua pointer merujuk ke blok yang sama, membebaskannya melalui salah satu pointer membuat pointer lainnya menggantung.
Lacak kepemilikan agar hanya pemilik yang membebaskannya.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof(int));
*a = 7;
int *b = a;
printf("%d\n", *b);
free(a);
a = NULL;
b = NULL;
printf("both nulled\n");
return 0;
}Menggantung Setelah realloc
Saat realloc memindahkan sebuah blok, pointer lama apa pun yang menunjuk ke lokasi sebelumnya menjadi pointer menggantung.
Gunakan hanya pointer yang dikembalikan oleh realloc.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof(int));
a[0] = 1;
int *b = realloc(a, 50 * sizeof(int));
/* a may now be dangling; use only b. */
b[0] = 2;
printf("%d\n", b[0]);
free(b);
return 0;
}Membebaskan di Fungsi Pembantu
Jika fungsi pembantu membebaskan sebuah blok, pointer milik pemanggil akan tertinggal dalam keadaan menggantung. Jadikan pointer tersebut NULL setelah pemanggilan, atau rancang fungsi pembantu agar menerima pointer ke pointer.
#include <stdio.h>
#include <stdlib.h>
void destroy(int **p) {
free(*p);
*p = NULL;
}
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
destroy(&p);
printf("p is %s\n", p == NULL ? "null" : "set");
return 0;
}Mengapa Berbahaya
Penggunaan setelah dibebaskan berbahaya karena memori tersebut mungkin kini berisi data lain. Penulisan dapat merusak keadaan yang tidak terkait, dan penyerang dapat mengeksploitasinya.
Pointer Menggantung Berdasarkan Cakupan
Pointer ke variabel yang cakupannya terbatas pada suatu blok menjadi tidak valid setelah blok tersebut berakhir. Jangan mempertahankan pointer lebih lama daripada masa hidup objek yang ditunjuknya.
#include <stdio.h>
int main(void) {
int *p;
{
int x = 10;
p = &x;
printf("in scope: %d\n", *p);
}
/* p now dangles; do not dereference it here. */
printf("block ended\n");
return 0;
}Mendeteksi Pointer Menggantung
Alat seperti AddressSanitizer dan Valgrind dapat mendeteksi penggunaan setelah dibebaskan saat program berjalan serta menunjukkan baris yang tepat.
Bangun program dengan pembersih memori selama pengembangan.
Ringkasan Siklus Hidup Aman dalam Kode
Alokasikan, gunakan, bebaskan, lalu jadikan NULL. Menjalankan langkah-langkah ini secara konsisten mencegah pointer menggantung.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
if (!p) return 1;
*p = 123;
printf("%d\n", *p);
free(p);
p = NULL;
return 0;
}Pemeriksaan Singkat
Uji pemahaman Anda tentang pointer menggantung.
Ringkasan
Anda telah mempelajari pointer menggantung:
- Pointer tersebut menunjuk ke memori yang sudah dibebaskan atau berada di luar cakupan; menggunakannya merupakan perilaku tidak terdefinisi.
- Hindari mengembalikan alamat variabel lokal; jangan pernah menggunakan pointer setelah
freeatau setelah realloc memindahkan sebuah blok. - Jadikan pointer
NULLsetelah membebaskannya dan lacak kepemilikan. - Gunakan pembersih memori dan Valgrind untuk mendeteksi penggunaan setelah dibebaskan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pointer Menggantung” gratis?
Ya — teks lengkap “Pointer Menggantung” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pointer Menggantung”?
Bahaya penggunaan setelah free. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C Academy?
Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pointer Menggantung” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- malloc dan free
- calloc dan realloc
- Kebocoran Memori
- Pointer Menggantung