Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Buat program C yang menunjukkan alokasi dinamis struct menggunakan malloc(). Programmu harus:

  1. Mendefinisikan struct bernama Car dengan anggota berikut:
    • Integer year untuk menyimpan tahun pembuatan
    • Array karakter brand berukuran 20 untuk menyimpan merek mobil
    • Array karakter model berukuran 25 untuk menyimpan model mobil
    • Float price untuk menyimpan harga mobil
    • Integer mileage untuk menyimpan jarak tempuh mobil
  2. Di fungsi main, mendeklarasikan pointer ke struct Car bernama carPtr
  3. Menggunakan malloc() untuk mengalokasikan memori secara dinamis bagi satu struct Car dan menetapkan alamat yang dikembalikan ke carPtr
  4. Memeriksa apakah alokasi memori berhasil:
    • Jika carPtr adalah NULL, mencetak Memory allocation failed dan keluar dari program
    • Jika alokasi berhasil, mencetak Memory allocation successful
  5. 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
  6. 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
  7. 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] years
    • Current Value: [current_value]
  8. Membebaskan memori yang dialokasikan secara dinamis menggunakan free(carPtr)
  9. 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler C online