Memperbesar dengan realloc
Ubah ukuran larik dinamis.
Memperbesar dengan realloc adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Saat Satu malloc Tidak Cukup
Terkadang Anda mengalokasikan sebuah larik, mengisinya, lalu menyadari bahwa Anda memerlukan ruang yang lebih besar. Anda tidak dapat begitu saja menulis melewati ujungnya.
realloc memungkinkan Anda mengubah ukuran blok heap yang sudah ada sambil mempertahankan data yang telah berada di sana.
Bentuk Pemanggilan realloc
realloc(ptr, new_bytes) menerima penunjuk lama dan ukuran total baru dalam byte.
Fungsi ini mengembalikan penunjuk ke blok dengan ukuran baru. Bagian awal data dipertahankan hingga ukuran yang lebih kecil antara ukuran lama dan ukuran baru.
int *bigger = realloc(a, new_n * sizeof(*a));Blok Mungkin Dipindahkan
realloc mungkin memperbesar blok di tempatnya, atau mungkin mengalokasikan blok baru, menyalin data Anda, lalu membebaskan blok lama.
Bagaimanapun juga, penunjuk lama mungkin menjadi tidak valid. Mulai saat itu, Anda harus menggunakan penunjuk yang dikembalikan.
a = realloc(a, new_n * sizeof(*a));
/* the old value of a may no longer be valid */Jebakan Penugasan ke Diri Sendiri
Menulis a = realloc(a, ...) terlihat rapi, tetapi berbahaya: jika realloc mengembalikan NULL, Anda telah menimpa a dan kehilangan penunjuk asli, sehingga blok lama bocor.
Gunakan variabel sementara sebagai gantinya.
int *tmp = realloc(a, new_n * sizeof(*a));
if (tmp == NULL) { /* a is still valid */ return 1; }
a = tmp;Memperbesar Larik dengan Aman
Program ini mengalokasikan 3 nilai bertipe int, lalu memperbesarnya menjadi 6 dengan realloc sambil mempertahankan tiga nilai pertama.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(3 * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < 3; i++) a[i] = i + 1;
int *tmp = realloc(a, 6 * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
for (int i = 3; i < 6; i++) a[i] = i + 1;
for (int i = 0; i < 6; i++) printf("%d\n", a[i]);
free(a);
return 0;
}Byte Baru Tidak Diinisialisasi
Saat Anda memperbesar blok, ruang tambahan di bagian akhir berisi data acak, sama seperti memori malloc yang baru dialokasikan.
realloc mempertahankan data lama Anda, tetapi tidak mengosongkan wilayah baru. Inisialisasikan wilayah tersebut sebelum membacanya.
a = realloc(a, 6 * sizeof(*a));
for (int i = 3; i < 6; i++) a[i] = 0; /* clear new slots */Strategi Penggandaan
Memanggil realloc untuk setiap elemen satu per satu akan lambat. Trik klasiknya adalah menggandakan kapasitas setiap kali ruang habis.
Dengan demikian, jumlah perubahan ukuran tetap kecil saat larik bertambah, sehingga kinerja rata-ratanya baik.
if (count == cap) {
cap = cap ? cap * 2 : 4;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}Membangun Larik dengan Menambahkan Elemen
Program ini dimulai dari keadaan kosong dan menambahkan angka, sambil menggandakan kapasitas sesuai kebutuhan.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = NULL;
size_t count = 0, cap = 0;
for (int v = 1; v <= 5; v++) {
if (count == cap) {
cap = cap ? cap * 2 : 2;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}
a[count++] = v;
}
for (size_t i = 0; i < count; i++) printf("%d\n", a[i]);
free(a);
return 0;
}realloc(NULL, n) Bertindak seperti malloc
Jika Anda memberikan NULL sebagai penunjuk, realloc berperilaku persis seperti malloc.
Itulah sebabnya memulai dengan a = NULL berfungsi dalam perulangan penggandaan: realloc pertama langsung mengalokasikan blok awal.
int *a = NULL;
a = realloc(a, 4 * sizeof(*a)); /* same as malloc(4 * sizeof(*a)) */Mengecilkan Blok
realloc juga dapat membuat blok menjadi lebih kecil. Data hingga ukuran baru dipertahankan; sisanya dibuang.
Pengecilan dapat mengembalikan memori, meskipun implementasi bebas mempertahankan blok yang lebih besar.
int *tmp = realloc(a, 2 * sizeof(*a)); /* down from more */
if (tmp) a = tmp;Hindari Luapan dalam Perhitungan Matematika
Saat kapasitas membesar, cap * sizeof(*a) dapat melampaui batas size_t dan berputar menjadi angka yang sangat kecil.
Untuk larik yang sangat besar, lindungi perkalian tersebut, atau gunakan reallocarray pada sistem yang menyediakannya.
if (cap > SIZE_MAX / sizeof(*a)) { /* overflow */ return 1; }
int *tmp = realloc(a, cap * sizeof(*a));Pemeriksaan Singkat
Uji pemahaman Anda tentang realloc.
Ringkasan
realloc mengubah ukuran blok heap dan mungkin memindahkannya, jadi selalu gunakan penunjuk yang dikembalikannya.
Tetapkan hasilnya ke variabel sementara agar kegagalan tidak menyebabkan kebocoran blok asli. Gandakan kapasitas untuk memperoleh kecepatan, inisialisasi slot baru, dan ingat bahwa realloc(NULL, n) sama dengan malloc. Selanjutnya, Anda akan membungkus logika ini dalam tipe vektor yang dapat digunakan kembali.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memperbesar dengan realloc” gratis?
Ya — teks lengkap “Memperbesar dengan realloc” 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 “Memperbesar dengan realloc”?
Ubah ukuran larik dinamis. 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 2 dari 4.
Berapa lama pelajaran “Memperbesar dengan realloc” 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
- Mengalokasikan Larik
- Memperbesar dengan realloc
- Tipe Vektor yang Dapat Digunakan Kembali
- Membebaskan Memori dan Menghindari Kebocoran