Mengalokasikan Larik
Sediakan memori heap.
Mengalokasikan Larik adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Mengapa Larik Dinamis?
Larik biasa memiliki ukuran tetap yang ditentukan saat kompilasi. Namun, sering kali Anda belum tahu berapa banyak elemen yang diperlukan sampai program berjalan.
Larik dinamis mengatasi hal ini: Anda meminta sistem operasi menyediakan satu blok memori saat program berjalan menggunakan malloc, lalu menentukan ukurannya dengan sebuah variabel.
Berkenalan dengan malloc
malloc (alokasi memori) berada dalam <stdlib.h>. Anda memberikan jumlah byte, lalu fungsi ini mengembalikan penunjuk ke blok tersebut, atau NULL jika gagal.
Memori tersebut berasal dari heap dan tetap tersedia sampai Anda membebaskannya.
int *p = malloc(10 * sizeof(int));Menentukan Ukuran dengan sizeof
Jangan pernah menulis jumlah byte secara tetap. Gunakan sizeof agar kode Anda tetap benar di berbagai platform.
Untuk mengalokasikan ruang bagi n bilangan bulat, kalikan n dengan sizeof(int). Idiom yang umum adalah n * sizeof(*p), yang menggunakan tipe penunjuk itu sendiri.
int *p = malloc(n * sizeof(*p));Selalu Periksa NULL
Jika sistem kehabisan memori, malloc mengembalikan NULL. Melakukan dereferensi pada penunjuk NULL akan membuat program Anda berhenti secara tiba-tiba.
Periksa hasilnya sebelum menggunakannya. Kebiasaan sederhana ini mencegah banyak kegagalan yang sulit dilacak.
int *p = malloc(n * sizeof(*p));
if (p == NULL) {
fprintf(stderr, "out of memory\n");
return 1;
}Alokasi Lengkap
Berikut program lengkap yang mengalokasikan ruang untuk 5 bilangan bulat, mengisinya, lalu mencetaknya.
Perhatikan kesimetrisannya: malloc di awal dan free di akhir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i * i;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}malloc Tidak Mengosongkan Memori
Memori dari malloc tidak diinisialisasi: isinya adalah sisa data apa pun yang sebelumnya berada di sana.
Membacanya sebelum menulis akan menghasilkan nilai yang tidak dapat diprediksi. Selalu tetapkan nilai untuk setiap elemen sebelum membacanya.
int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;calloc Mengosongkan Memori untuk Anda
calloc(count, size) mengalokasikan ruang untuk count elemen berukuran size byte dan menetapkan setiap byte menjadi nol.
Gunakan ini saat Anda menginginkan larik yang bersih dan terisi nol. Fungsi ini juga mencegah luapan dalam perkalian.
int *a = calloc(5, sizeof(*a));
/* every element is now 0 */calloc dalam Praktik
Program ini menggunakan calloc dan memastikan bahwa larik dimulai dengan nilai nol sebelum kita mengubahnya.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = calloc(n, sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}Mengindeks Blok
Penunjuk ke blok heap berperilaku seperti nama larik. Anda dapat menggunakan a[i] untuk membaca dan menulis elemen apa pun dari 0 hingga n-1.
Secara internal, a[i] sama dengan *(a + i).
int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2; /* same as a[1] = 2 */
a[2] = 3;Perhatikan Batasnya
Jika Anda mengalokasikan n elemen, indeks yang valid adalah 0 hingga n-1. Menulis ke a[n] merupakan perilaku yang tidak terdefinisi.
C tidak memeriksa batas untuk Anda, sehingga bug kurang atau lebih satu dapat merusak memori secara diam-diam.
int *a = malloc(3 * sizeof(*a));
a[2] = 99; /* OK, last valid index */
/* a[3] = 0; BUG: out of bounds */Membaca Ukuran Saat Program Berjalan
Inilah kekuatan sebenarnya: ukuran dapat berasal dari masukan, berkas, atau perhitungan. Kode yang sama dapat mengalokasikan 2 atau 2 juta elemen.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 6; /* could be scanf'd */
long *a = malloc(n * sizeof(*a));
if (!a) return 1;
long sum = 0;
for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
printf("%ld\n", sum);
free(a);
return 0;
}Periksa Cepat
Uji pemahaman Anda tentang alokasi.
Ringkasan
Anda mengalokasikan larik dinamis dengan malloc(n * sizeof(*p)) atau larik yang terisi nol dengan calloc(n, sizeof(*p)).
Selalu periksa NULL, ingat bahwa malloc menyisakan data acak, gunakan indeks dari 0 hingga n-1, dan pasangkan setiap alokasi dengan free. Selanjutnya, Anda akan mempelajari cara mengubah ukuran blok sambil mempertahankan datanya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengalokasikan Larik” gratis?
Ya — teks lengkap “Mengalokasikan Larik” 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 “Mengalokasikan Larik”?
Sediakan memori heap. 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 1 dari 4.
Berapa lama pelajaran “Mengalokasikan Larik” 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