Seri Tutorial Bahasa C – Bagian 9: Membangun Struktur-struktur

Pada artikel ini, Anda akan diperkenalkan dengan struktur “struct” dan tipe data abstrak “union” serta ditunjukkan pula bagaimana mereka digunakan dalam program-program C untuk mengelompokkan beberapa variabel dengan tipe data berbeda.

Catatan:

  • Silahkan Anda mengeklik icon menu     untuk berpindah subbagian.
  • Video pelengkap dalam tutorial ini akan lebih jelas dilihat dengan resolusi 720p dan mode Full screen.
9.1. Pengelompokan dalam Sebuah Struktur
9.2. Mendefinisikan Struktur-struktur Tipe
9.3. Menggunakan Pointer dalam Struktur-struktur
9.4. Melewatkan Struktur ke Fungsi
9.5. Pengelompokan dalam Sebuah Union
9.6. Mengalokasikan Memori
9.7. Ringkasan

9.1. Pengelompokan dalam Sebuah Struktur

Sebuah struktur dalam bahasa C dapat berisi satu atau beberapa variabel yang memiliki tipe data sama ataupun berbeda. Kesemuanya dikelompokkan secara bersama dalam sebuah struktur tunggal dan bisa diacukan melalui namanya. Variabel-variabel yang berada di dalam struktur dikenal sebagai “anggota-anggota” struktur tersebut.

Pengelompokan variabel-variabel yang berelasi dalam sebuah struktur begitu berguna dalam mengorganisasikan data yang rumit, khususnya dalam program-program besar. Sebagai contoh, sebuah struktur bisa dibuat untuk menjelaskan sebuah rekaman pembayaran gaji dengan variabel-variabel untuk menyimpan nama, alamat, besar gaji, pajak dan sebagainya untuk seorang karyawan.

Dalam sebuah program C, sebuah struktur dideklarasikan menggunakan kata kunci struct yang diikuti dengan sebuah nama dan kurung kurawal yang di dalamnya berisi anggota-anggota variabel. Selanjutnya, deklarasi struktur harus diakhiri dengan sebuah tanda titik koma (semicolon) tepat setelah penutupan kurung kurawal. Jadi, sebuah struktur yang berisi anggota-anggota untuk menjelaskan sebuah titik koordinat x dan y dalam sebuah grafik dapat dilihat sebagai berikut:

struct s__koordinat
{
    int vg__x ;
    int vg__y ;
} ;

Sebagai pilihan, nama “label” bisa diikutsertakan tepat sebelum pengakhir tanda titik koma. Efeknya, deklarasi struktur menjelaskan sebuah tipe data dan nama label baru yang berlaku seperti variabel tipe data terkait. Sebagai contoh, sebuah variabel bernama “sl__titik” yang bertipe data “s__koordinat” dapat dideklarasikan sebagai berikut:

struct s__koordinat
{
    int vg__x ;
    int vg__y ;
} sl__titik ;

Setiap anggota struct kemudian bisa diacukan dengan menempelkan operator “.” dan nama anggota pada nama label, seperti misalnya sl__titik.vg__x.

Pun, sebuah variabel struktur baru bisa dideklarasikan menggunakan nama sebuah struktur yang ada dan variabel baru tersebut akan mewarisi sifat-sifat anggota aslinya. Sebagai contoh, untuk membuat sebuah variabel struktur baru bernama “vs__atas” berdasarkan struktur bernama “s__koordinat” dengan anggota vs__atas.vg__x dan vs__atas.vg__y maka dilakukan dengan deklarasi berikut:

struct s__koordinat vs__atas ;

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pada pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Deklarasikan sebuah struktur dengan dua anggota dan sebuah label.

    struct s__koordinat
    {
        int vg__x ;
        int vg__y ;
    } sl__titik ;
  3. Kemudian buatlah turunan struktur lain.

    struct s__koordinat vs__atas ;
  4. Selanjutnya, tambahkan sebuah fungsi main() yang menginisialisasikan kedua anggota untuk masing-masing struktur.

    int main()
    {
        sl__titik.vg__x = 10 ; sl__titik.vg__y = 15 ;
        vs__atas.vg__x = 2 ; vs__atas.vg__y = 7 ;
    }
  5. Sekarang keluarkan nilai yang tersimpan dalam setiap anggota struktur.

    printf( "\nKoordinat titik x: %d , titik y: %d\n" , sl__titik.vg__x, sl__titik.vg__y ) ;
    printf( "\nKoordinat atas x: %d , atas y: %d\n" , vs__atas.vg__x , vs__atas.vg__y ) ;
  6. Pada bagian akhir blok fungsi main() berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada deklarasi fungsi.

    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan jalankan untuk melihat nilai-nilai simpanan dalam anggota-anggota struktur.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.1. Pengelompokan dalam Sebuah Struktur pada Bahasa C.

9.2. Mendefinisikan Struktur-struktur Tipe

Sebuah tipe data yang didefinisikan oleh sebuah struktur bisa dideklarasikan sebagai sebuah definisi tipe data aktual dengan menambahkan kata kunci typedef pada awal deklarasi struktur. Hal tersebut mengidentifikasikan struktur sebagai sebuah prototipe sebagaimana struktur-struktur lain bisa dideklarasikan hanya dengan sembarang nama labelnya — tanpa kata kunci struct.

Menggunakan typedef mungkin sering membantu untuk menyederhanakan kode dengan tidak membutuhkan kata kunci struct saat mendeklarasikan variabel-variabel sebuah tipe data yang terdefinisi dalam sebuah struktur. Bagaimanapun, sangat berguna untuk mengapitalisasi nama label sehingga secara mudah dikenali sebagai sebuah tipe data struktur yang terdefinisi.

Deklarasi-deklarasi variabel tipe data yang terdefinisi dalam sebuah struktur, secara pilihan bisa menginisialisasi semua anggotanya dengan menyematkan nilai-nilai sebagai sebuah daftar yang dipisahkan oleh tanda koma dalam sebuah kurung kurawal.

Struktur-struktur juga bisa disarangkan dalam struktur-struktur lain. Dalam kasus tersebut, anggota-anggota tersendiri diacukan menggunakan dua operator titik “.“, dengan sintaks:

struktur-luar.struktur-dalam.anggota

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Deklarasikan sebuah struktur tak bernama yang mendefinisikan sebuah tipe data dengan dua anggota dan sebuah label.

    typedef struct
    {
        int vg__x ;
        int vg__y ;
    } sl__titik ;
  3. Kemudian buatlah dua variabel dari tipe data struktur yang telah didefinisikan dan inisialisasikan nilai kedua anggota untuk variabel pertama.

    sl__titik vs__atas = { 0 , 10 } ;
    sl__titik vs__bawah ;
  4. Selanjutnya, tambahkan sebuah fungsi main() yang menginisialisasi kedua anggota variabel lainnya dari tipe data struktur yang terdefinisi.

    int main()
    {
        vs__bawah.vg__x = 20 ;
        vs__bawah.vg__y = 40 ;
    }
  5. Sekarang berikan keluaran koordinat kedua sl__titik.

    printf( "\nKoordinat atas x: %d, y: %d\n" , vs__atas.vg__x , vs__atas.vg__y ) ;
    printf( "\nKoordinat bawah x: %d, y: %d\n" , vs__bawah.vg__x , vs__bawah.vg__y ) ;
  6. Sebelum blok fungsi main(), masukkan sebuah struktur kedua yang mendefinisikan sebuah tipe data dengan dua anggota struktur bersarang.

    typedef struct
    {
        sl__titik vg__a ;
        sl__titik vg__b ;
    } sl__kotak ;
  7. Kemudian deklarasikan sebuah variabel tipe data struktur terdefinisi dan inisialisasikan semua anggotanya.

    sl__kotak vs__persegi = { 10 , 20 , 40 , 15 } ;
  8. Kembali ke blok fungsi main(), tampilkan keluaran koordinat semua sl__titik yang terkandung dalam anggota struktur bersarang.

    printf( "\nTitik a x: %d" , vs__persegi.vg__a.vg__x ) ;
    printf( "\nTitik a y: %d" , vs__persegi.vg__a.vg__y ) ;
    printf( "\nTitik b x: %d" , vs__persegi.vg__b.vg__x ) ;
    printf( "\nTitik b y: %d" , vs__persegi.vg__b.vg__y ) ;
  9. Pada bagian akhir blok fungsi main() berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  10. Simpanlah berkas program kemudian kompilasi dan jalankan untuk melihat nilai yang tersimpan dalam anggota-anggota struktur.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.2 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.2. Mendefiniskan Struktur-struktur Tipe dalam Bahasa C.

9.3. Menggunakan Pointer dalam Struktur-struktur

Terdapat sebuah kelebihan dalam menggunakan sebuah pointer karakter di dalam sebuah struktur sebagai sebuah wadah kalimat dibandingkan menggunakan sebuah larik karakter untuk tujuan yang sama.

Keseluruhan sebuah kalimat hanya bisa disematkan ke sebuah larik char pada pendeklarasiannya. Satu-satunya cara untuk menyematkan sebuah kalimat secara bertahap ke sebuah larik struct char menggunakan operator = adalah dengan menyematkan karakter-karakter tersendiri ke satu anggota pada satu waktu.

Dalam setiap penyematan, nilai ke sebelah kiri operator = dikenal sebagai “nilai-L” yang mewakili lokasi (Location) memori, sedangkan nilai ke kanan operator = dikenal sebagai “nilai-R” yang mewakili data yang dibaca (Read) ke lokasi tersebut.

Setiap anggota tersendiri sebuah larik char merupakan sebuah nilai-L, dengan mana sebuah karakter bisa disematkan , namun sebuah pointer char juga merupakan sebuah nilai-L dengan mana keseluruhan sebuah kalimat bisa disematkan setelah pointer tersebut dideklarasikan.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Kemudian deklarasikan sebuah struktur tak bernama yang mendefinisikan sebuah tipe data dengan sebuah anggota larik karakter dan sebuah nama label.

    typedef struct
    {
        char vg__larik_karakter[6] ;
    } sl__tipe_larik ;
  3. Sekarang deklarasikan sebuah struktur tak bernama yang mendefinisikan sebuah tipe data dengan sebuah anggota pointer karakter dan sebuah nama label.

    typedef struct
    {
        char *pg__larik_karakter ;
    } sl__tipe_pointer ;
  4. Kemudian deklarasikan sebuah variabel untuk masing-masing tipe data struktur terdefinisi dan inisialisasikan sebuah anggota untuk setiap variabel.

    sl__tipe_larik vs__larik = { 'S' , 'a' , 'y' , 'a' , ' ' , '\0' } ;
    sl__tipe_pointer vs__pointer = { "Anda " } ;
  5. Selanjutnya tambahkan sebuah fungsi main() yang memberikan keluaran nilai kalimat variabel anggota larik karakter.

    int main()
    {
        printf( "\nUntaian karakter larik: %s" , vs__larik.vg__larik_karakter ) ;
    }
  6. Dalam blok fungsi main(), secara berurutan sematkan sebuah nilai baru pada masing-masing anggota larik karakter dan tampilkan keluaran nilai kalimat yang baru.

    vs__larik.vg__larik_karakter[0] = 'r' ;
    vs__larik.vg__larik_karakter[1] = 'a' ;
    vs__larik.vg__larik_karakter[2] = 'j' ;
    vs__larik.vg__larik_karakter[3] = 'i' ;
    vs__larik.vg__larik_karakter[4] = 'n' ;
    vs__larik.vg__larik_karakter[5] = '\0' ;
    
    printf( "%s\n" , vs__larik.vg__larik_karakter ) ;
  7. Kemudian tampilkan keluaran nilai kalimat variabel anggota pointer karakter.

    printf( "\nUntaian karakter pointer: %s" , vs__pointer.pg__larik_karakter ) ;
  8. Sekarang sematkan sebuah nilai baru ke pointer karakter dan tampilkan keluaran nilai kalimat yang baru.

    vs__pointer.pg__larik_karakter = "rajin" ;
    printf( "%s\n\n" , vs__pointer.pg__larik_karakter ) ;
  9. Pada bagian akhir blok fungsi main() berikan keluaran sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  10. Simpanlah berkas program kemudian kompilasi dan jalankan untuk melihat nilai-nilai yang tersimpan dalam anggota struktur.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.3 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.3. Menggunakan Pointer dalam Struktur-struktur pada Bahasa C.

9.4. Melewatkan Struktur ke Fungsi

Nilai-nilai anggota struktur bisa disimpan di dalam sebuah larik seperti halnya nilai-nilai sembarang tipe data lainnya. Larik tersebut dideklarasikan seperti biasa namun metode yang digunakan untuk menyematkan nilai-nilai ke elemen atau anggotanya agak berbeda. Setiap nilai anggota dalam daftar terpisah-koma harus diapit dengan sepasang kurung kurawal.

Demikian pula, sebuah struct bisa dilewatkan sebagai sebuah masukan atau argumen ke sebuah fungsi seperti halnya sembarang variabel lainnya. Tipe data sebuah struktur harus ditentukan baik dalam deklarasi prototipe fungsi dan definisinya, bersama-sama dengan sebuah nama variabel dengan mana fungsi dapat mengalamatkan nilai-nilai anggotanya.

Namun perlu untuk diingat bahwa melewatkan berdasarkan nilai, biasanya dengan menggunakan sebuah variabel biasa, berarti bahwa fungsi akan beroperasi pada sebuah salinan struct — nilai-nilai anggota aslinya akan tidak berubah. Pada sisi lain, melewatkan struct berdasarkan acuan dengan menggunakan sebuah variabel pointer berarti bahwa fungsi akan beroperasi pada anggota asli struct — sehingga nilai-nilai anggota aslinya akan juga berubah.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Selanjutnya, deklarasikan sebuah struktur tak bernama yang mendefinisikan sebuah tipe data dengan dua anggota dan sebuah nama label.

    typedef struct
    {
        char *pg__nama ;
        int vg__kuantitas ;
    } sl__satuan_produk
  3. Sekarang deklarasikan sebuah larik tipe data struktur dan inisialisasikan masing-masing anggota struktur tersebut.

    sl__satuan_produk vs__larik_sayur[3] = { { "Bayam" , 5 } , { "Sawi" , 10 } , { "Kol" , 15 } } ;
  4. Tambahkan sebuah prototipe fungsi yang akan melewatkan sebuah variabel struktur dan sebuah variabel pointer ke sebuah struktur sebagai masukan-masukan atau argumen.

    void f__tampilkan( sl__satuan_produk vf__nilai , sl__satuan_produk *pf__acuan ) ;
  5. Sekarang definisikan fungsi yang telah dideklarasikan dalam prototipe, yang dimulai dengan mengungkap nilai argumen-argumen yang dilewatkan.

    void f__tampilkan( sl__satuan_produk vf__nilai , sl__satuan_produk *pf__acuan )
    { printf( "%s: %d\n" , vf__nilai.pg__nama , vf__nilai.vg__kuantitas ) ; }
  6. Selanjutnya dalam blok fungsi, ubahlah nilai salinan anggota struct yang dilewatkan kemudian berikan keluaran nilai-nilai baru.

    vf__nilai.pg__nama = "Asparagus" ; 
    vf__nilai.vg__kuantitas = 20 ;
    
    printf( "%s: %d\n" , vf__nilai.pg__nama , vf__nilai.vg__kuantitas ) ;
  7. Konfirmasikan bahwa nilai-nilai asli tidak berubah.

    printf( "%s: %d\n" , vs__larik_sayur[0].pg__nama , vs__larik_sayur[0].vg__kuantitas ) ;
  8. Kemudian ubahlah nilai-nilai anggota asli dan berikan keluaran nilai yang baru.

    pf__acuan->pg__nama = "Kecambah" ;
    pf__acuan->vg__kuantitas = 25 ;
    
    printf( "%s: %d\n" , vs__larik_sayur[0].pg__nama , vs__larik_sayur[0].vg__kuantitas ) ;
  9. Tepat sebelum blok fungsi, masukkan sebuah fungsi main() yang memanggil fungsi lain yang melewatkan sebuah struct dan sebuah pointer sebagai argumen atau masukan.

    int main()
    {
        f__tampilkan( vs__larik_sayur[0] , &vs__larik_sayur[0] ) ;
    }
  10. Pada bagian akhir blok fungsi main() berikan keluaran sebuah nilai bilangan bulat nol seperti yang disyaratkan pada deklarasi fungsi.

    return 0 ;
  11. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat nilai-nilai yang disimpan dalam anggota-anggota struktur.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.4 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.4. Melewatkan Struktur ke Fungsi dalam Bahasa C.

9.5. Pengelompokan dalam Sebuah Union

Dalam pemrograman bahasa C, sebuah “gabungan” atau “union” mengizinkan kepingan data yang berbeda, dengan sembarang tipe data, untuk disimpan pada lokasi memori yang sama saat program berjalan — menyematkan sebuah nilai ke union akan menimpa apa yang disimpan sebelumnya di sana. Ini mengizinkan penggunaan memori secara efisien.

Sebuah union sama seperti sebuah struct namun dideklarasikan dengan kata kunci union, karena sifat alaminya, anggota-anggotanya hanya bisa disematkan secara individual saat program berjalan atau diproses.

Sebuah larik union bisa dibuat dalam cara yang sama seperti membuat sebuah larik struct dalam contoh-contoh sebelumnya namun anggota-anggota union hanya bisa diinisialisasikan dalam deklarasi jika semuanya bertipe data sama. Sebuah pointer ke sebuah union bisa dibuat tepat sama seperti membuat sebuah pointer ke sebuah struct dan sebuah union bisa dilewatkan ke sebuah fungsi sama seperti halnya sembarang variabel lain.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Kemudian deklarasikan sebuah struktur tak bernama yang mendefinisikan sebuah tipe data dengan tiga anggota dan sebuah nama label.

    typedef struct
    { 
        int vg__s_bilangan ; 
        char vg__s_huruf , *pg__s_untaian_karakter ;
    } sl__struct ;
  3. Sekarang deklarasikan sebuah union tak bernama yang mendefinisikan sebuah tipe data dengan tiga anggota dan sebuah nama label.

    typedef union
    {
        int vg__u_bilangan ;
        char vg__u_huruf , *pg__u_untaian_karakter ;
    } ul__union ;
  4. Tambah sebuah fungsi main() yang mendeklarasikan sebuah variabel tipe data struct dan inisialisasikan setiap anggotanya.

    int main()
    {
        sl__struct vs__data = { 5 , 'A' , "Kelahiran" } ;
    }
  5. Sekarang dalam blok fungsi main() deklarasikan sebuah variabel tipe data union.

    ul__union vu__data ;
  6. Setelah deklarasi variabel, tampilkan keluaran nilai dan alamat memori masing-masing anggota struct.

    printf( "\nStruktur:\n-- Bilangan: %d" , vs__data.vg__s_bilangan ) ;
    printf( "\tdisimpan di: %p\n" , &vs__data.vg__s_bilangan ) ;
    
    printf( "-- Huruf: %c" , vs__data.vg__s_huruf ) ;
    printf( "\tdisimpan di: %p\n" , &vs__data.vg__s_huruf ) ;
    
    printf( "-- Untaian karakter: %s" , vs__data.pg__s_untaian_karakter ) ;
    printf( "\tdisimpan di: %p\n" , &vs__data.pg__s_untaian_karakter ) ;
  7. Sekarang sematkan sebuah nilai ke anggota pertama union kemudian tampilkan nilai dan alamat memorinya.

    vu__data.vg__u_bilangan = 15 ;
    printf( "\nUnion:\n-- Bilangan: %d" , vu__data.vg__u_bilangan ) ;
    printf( "\tdisimpan di: %p\n" , &vu__data.vg__u_bilangan ) ;
  8. Kemudian sematkan sebuah nilai ke anggota kedua union dan tampilkan nilai dan alamat memorinya.

    vu__data.vg__u_huruf = 'B' ;
    printf( "-- Huruf: %c" , vu__data.vg__u_huruf ) ;
    printf( "\tdisimpan di: %p\n" , &vu__data.vg__u_huruf ) ;
  9. Terakhir sematkan sebuah nilai ke anggota union yang ketiga kemudian tampilkan nilai dan alamat memorinya.

    vu__data.pg__u_untaian_karakter = "Dunia" ;
    printf( "-- Untaian karakter: %s" , vu__data.pg__u_untaian_karakter ) ;
    printf( "\tdisimpan di: %p\n" , &vu__data.pg__u_untaian_karakter ) ;
  10. Pada bagian akhir blok fungsi main() berikan keluaran sebuah nilai bilangan bulat nol seperti yang disyaratkan pada pendeklarasian fungsi.

    return 0 ;
  11. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat nilai-nilai yang disimpan dalam anggota struktur dan union serta alamat tempat mereka disimpan.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.5 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.5. Pengelompokan dalam Sebuah Union pada Bahasa C.

9.6. Mengalokasikan Memori

Berkas header pustaka standar bahasa C stdlib.h menyediakan fungsi-fungsi pengelolaan memori, dengan mana sebuah program dapat secara eksplisit meminta agar sejumlah memori tersedia saat program dijalankan.

Fungsi malloc() membutuhkan sebuah argumen atau masukan bilangan bulat untuk menentukan seberapa banyak byte memori untuk dialokasikan, sementara fungsi calloc() membutuhkan dua masukan bilangan bulat yang dikalikan bersama-sama juga untuk menentukan seberapa banyak byte memori yang dialokasikan. Kedua fungsi tersebut memberikan keluaran sebuah pointer pada awal blok memori ketika berhasil atau sebuah nilai NULL saat terjadi kegagalan.

Memori yang sebelumnya dialokasikan dengan malloc() atau calloc() bisa ditingkatkan dengan fungsi realloc(). Ini membutuhkan pointer ke blok memori yang dialokasikan sebagai argumen atau masukan pertamanya, dan sebuah bilangan bulat yang menentukan ukuran blok yang baru sebagai masukan keduanya. Ia akan mengembalikan sebuah pointer pada awal blok memori yang telah diperbesar ketika berhasil atau sebuah nilai NULL saat gagal.

Semua memori yang dialokasikan dengan fungsi tersebut seyogianya dibebaskan saat tidak lagi dibutuhkan dengan menentukan pointer blok memori sebagai argumen ke fungsi free().

Tidak ada fungsi standar C untuk menentukan ukuran sebuah memori yang dialokasikan secara dinamis namun ia bisa diketahui dengan fungsi-fungsi platform yang spesifik. Pada Windows terdapat _msize() dan pada Linux terdapat malloc_usable_size(). Kedua fungsi tersebut membutuhkan pointer blok memori sebagai masukan atau argumennya.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar dan fungsi-fungsi pengelolaan memori.

    #include <stdio.h>
    #include <malloc.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel bilangan bulat dan sebuah variabel pointer bilangan bulat.

    int main()
    {
        int v__ukuran , *p__memori ;
    }
  3. Lakukan permintaan memori untuk mengakomodasi atau menampung 100 bilangan bulat.

    p__memori = malloc( 100 * sizeof( int ) ) ;
  4. Selanjutnya tampilkan detail blok memori yang teralokasi atau sebuah pesan himbauan jika permintaan tersebut gagal.

    if( p__memori != NULL )
    {
        v__ukuran = malloc_usable_size( p__memori ) ; // platform Linux
        printf( "\nUkuran blok untuk 100 bilangan bulat: %d byte\n" , v__ukuran ) ;
        printf( "Berawal di %p\n" , p__memori) ;
    }else{
        printf( "Memori tidak cukup!\n" ) ;
        return 1 ;
    }
  5. Sekarang coba untuk memperbesar blok memori yang teralokasi dan tampilkan detailnya atau sebuah pesan himbauan bila permintaan tersebut gagal.

    p__memori = realloc( p__memori , v__ukuran + ( 100 * sizeof( int ) ) ) ;
    if( p__memori != NULL )
    {
        v__ukuran = malloc_usable_size( p__memori ) ; // platform Linux
        printf( "\nUkuran blok untuk 200 bilangan bulat: %d byte" , v__ukuran ) ;
        printf( "Berawal di %p\n" , p__memori ) ;
    }else{
        printf( "Memori tidak cukup!\n" ) ;
        return 1 ;
    }
  6. Pada akhir blok fungsi main(), ingatlah untuk membebaskan memori yang telah teralokasi kemudian berikan keluaran nilai bilangan bulat nol.

    free( p__memori ) ;
    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat blok memori yang teralokasi saat permintaan yang dilakukan berhasil.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 9.6 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 9.6. Mengalokasikan Memori dalam Bahasa C.

9.7. Ringkasan

  • Sebuah struct bisa berisi satu atau lebih variabel dengan sembarang tipe data yang dikenal sebagai anggota struct.
  • Masing-masing anggota struct bisa diacukan dengan menempelkan namanya ke sebuah nama label dengan operator titik “.“.
  • Turunan lanjutan sebuah struct akan mewarisi kepemilikan atau properti anggota asli dari mana mereka diturunkan.
  • Kata kunci struct bisa diawali dengan kata kunci typedef untuk mendeklarasikan struct sebagai sebuah tipe data.
  • Sebagai saran, sangat berguna untuk mengkapitalisasi nama-nama label untuk mengidentifikasi bahwa ia merupakan tipe-tipe data yang didefinisikan oleh struktur. Namun untuk alasan pribadi, penulis lebih memilih untuk menggunakan prefiks “sl__“.
  • Deklarasi-deklarasi variabel bisa secara bebas menginisialisasi setiap anggota struct dengan menyematkan nilai pada sebuah daftar terpisah-koma.
  • Sebuah pointer ke sebuah struct memegang alamat memori pada awal kawasan memori yang digunakan untuk menyimpan data anggota.
  • Dalam sebuah pointer struct, operator titik “.” bisa digantikan dengan operator panah “->“.
  • Anggota-anggota dalam sebuah larik struktur bisa secara bebas diinisialisasi dalam deklarasi — namun setiap daftar nilai anggota harus diapit dengan sepasang kurung kurawal.
  • Sebuah struct bisa dilewatkan sebagai sebuah argumen ke sebuah fungsi sama seperti halnya sembarang variabel lainnya.
  • Melewatkan sebuah variabel struct ke sebuah fungsi berarti ia akan beroperasi sebagai sebuah salinan anggota struct namun melewatkan sebuah variabel pointer struct berarti fungsi tersebut beroperasi pada anggota-anggota aslinya.
  • Sebuah union mirip seperti sebuah struct dengan mana kepingan-kepingan data yang berbeda disimpan pada lokasi memori yang sama saat program diproses atau berjalan.
  • Berkas header pustaka standar bahasa C stdlib.h menyediakan fungsi malloc(), calloc() dan realloc() yang bisa mengalokasikan memori, dan fungsi free() untuk membebaskan memori yang teralokasi.

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.