Alokasi Dinamis Struct
Termasuk bagian Logika dan Alur dalam perjalanan C di Coddy. Pelajaran 48 dari 63.
Sejauh ini, kamu telah belajar cara membuat struct di stack, yaitu struct tersebut ada dalam cakupan tempat struct dideklarasikan dan otomatis dibersihkan saat cakupan itu berakhir. Namun, bagaimana jika kamu perlu agar struct tetap ada di luar cakupan awalnya, atau jika kamu tidak tahu saat compile berapa banyak struct yang akan kamu perlukan?
Di sinilah alokasi dinamis berperan. Kamu dapat menggunakan malloc() untuk membuat struct di heap, seperti yang akan kamu lakukan untuk tipe data lainnya. Perbedaan utamanya adalah struct yang dialokasikan secara dinamis tetap berada di memori sampai kamu secara eksplisit membebaskannya dengan free().
Berikut sintaks untuk mengalokasikan struct secara dinamis:
struct Point *ptr = malloc(sizeof(struct Point));Ini mengalokasikan cukup memori di heap untuk menampung satu struct Point dan mengembalikan pointer ke memori tersebut. Setelah itu, kamu dapat menggunakan operator panah untuk mengakses dan mengubah anggota struct:
ptr->x = 10;
ptr->y = 20;Ingatlah untuk selalu memeriksa apakah malloc() berhasil (mengembalikan nilai yang bukan NULL) dan memanggil free(ptr) setelah kamu selesai menggunakan struct tersebut untuk mencegah kebocoran memori. Teknik ini penting untuk membuat program fleksibel yang dapat membuat dan mengelola struktur data saat dijalankan.
Tantangan
MudahBuat program C yang menunjukkan alokasi dinamis struct menggunakan malloc(). Programmu harus:
- Mendefinisikan
structbernamaCardengan anggota berikut:- Integer
yearuntuk menyimpan tahun pembuatan - Array karakter
brandberukuran 20 untuk menyimpan merek mobil - Array karakter
modelberukuran 25 untuk menyimpan model mobil - Float
priceuntuk menyimpan harga mobil - Integer
mileageuntuk menyimpan jarak tempuh mobil
- Integer
- Di fungsi main, mendeklarasikan pointer ke struct
CarbernamacarPtr - Menggunakan
malloc()untuk mengalokasikan memori secara dinamis bagi satu structCardan menetapkan alamat yang dikembalikan kecarPtr - Memeriksa apakah alokasi memori berhasil:
- Jika
carPtradalahNULL, mencetakMemory allocation faileddan keluar dari program - Jika alokasi berhasil, mencetak
Memory allocation successful
- Jika
- Membaca nilai input berikut dan menetapkannya ke anggota struct menggunakan operator panah:
- Membaca integer untuk year dan menetapkannya menggunakan
carPtr->year - Membaca string untuk brand dan menetapkannya menggunakan
carPtr->brand - Membaca string untuk model dan menetapkannya menggunakan
carPtr->model - Membaca float untuk price dan menetapkannya menggunakan
carPtr->price - Membaca integer untuk mileage dan menetapkannya menggunakan
carPtr->mileage
- Membaca integer untuk year dan menetapkannya menggunakan
- Setelah membaca semua nilai, melakukan perhitungan berikut menggunakan operator panah:
- Menghitung usia mobil dengan mengurangi year dari 2024:
int age = 2024 - carPtr->year; - Menghitung tingkat depresiasi berdasarkan usia: jika age lebih besar dari 10, menetapkan depreciation ke 0.6, jika tidak, menetapkannya ke 0.8
- Menghitung nilai saat ini:
carPtr->price * depreciation
- Menghitung usia mobil dengan mengurangi year dari 2024:
- Mencetak informasi mobil menggunakan operator panah dalam format persis berikut:
Car Information:Year: [year]Brand: [brand]Model: [model]Original Price: [price]Mileage: [mileage]Age: [age] yearsCurrent Value: [current_value]
- Membebaskan memori yang dialokasikan secara dinamis menggunakan
free(carPtr) - Mencetak
Memory freed successfully
Tantangan ini menguji pemahamanmu tentang alokasi struct dinamis menggunakan malloc(), pemeriksaan kegagalan alokasi, akses anggota struct melalui pointer menggunakan operator panah, dan pembebasan memori yang dialokasikan dengan benar menggunakan free(). Kamu akan berlatih menjalani seluruh siklus pengelolaan memori dinamis dengan struct.
Coba sendiri
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: Definisikan struct Car di sini
int main() {
// TODO: Deklarasikan pointer ke struct Car bernama carPtr
// TODO: Gunakan malloc() untuk mengalokasikan memori bagi satu struct Car
// TODO: Periksa apakah alokasi memori berhasil
// Baca nilai input
int year, mileage;
char brand[20], model[25];
float price;
scanf("%d", &year);
scanf("%s", brand);
scanf("%s", model);
scanf("%f", &price);
scanf("%d", &mileage);
// TODO: Tetapkan nilai input ke anggota struct menggunakan operator panah
// TODO: Hitung usia, penyusutan, dan nilai saat ini
// TODO: Cetak informasi mobil dalam format yang diminta
// TODO: Bebaskan memori yang dialokasikan dan cetak pesan keberhasilan
return 0;
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Dasar-Dasar Pointer
Apa Itu Pointer?Mendeklarasikan PointerOperator Address-Of (&)Operator Dereference (*)Pointer NULLRekap: Dasar-Dasar Pointer4Proyek: Utilitas Teks Sederhana
Gambaran Umum ProyekMenghitung Karakter2Pointer dan array
Nama array sebagai pointerElemen array dan pointerAritmetika pointerMembandingkan pointerRangkuman: Menelusuri array dengan pointer5Pointer dan Fungsi
Penerusan dengan NilaiMeneruskan Pointer ke FungsiMengubah Variabel melalui PointerContoh Klasik: SwapMeneruskan Array ke FungsiRingkasan: Argumen Pointer Fungsi8Struct dan Pointer
Pointer ke StructOperator Panah (->)Mengirim Struct berdasarkan NilaiMengirim Pointer StructAlokasi Dinamis StructUlasan: Memodifikasi Struct dengan Pointer11Tantangan Rangkuman Akhir
Rangkuman: Penggabungan string DinamisRangkuman: array berisi structRangkuman: Penghitung Frekuensi Kata3Array char dan String
String sebagai array charPenanda akhir nullInput String dengan scanfMenggunakan strlen()Menggunakan strcpy()Menggunakan strcat()Menggunakan strcmp()Ulasan: Fungsi String DasarLatihan sendiri: Compiler C online