Lompat ke konten Lompat ke sidebar Lompat ke footer

Anggota Array Fleksibel Struct Pada Bahasa C

Flexible Array Member (FAM) atau Anggota Array Fleksibel merupakan suatu fitur yang diperkenalkan pada Standar C99 dari Bahasa Pemrograman C.

Sebelum memahami lebih dalam materi tentang Anggota Array Fleksibel Struct Pada Bahasa C, terlebih dahulu pelajari materi tentang: Bit Fields Bahasa C Beserta Penjelasannya, Operasi Pada Variabel Struct Bahasa C, dan Anggota Structure, Padding, dan Data Packing Bahasa C.

Untuk struct pada Bahasa C dari standar C99 dan seterusnya, dapat dilakukan proses deklarasi array tanpa sebuah dimensi dan nilai ukurannya dapat fleksibel secara alami sesuai dengan nilai yang diberikan pada array. Array seperti ini, yang terdapat dalam suatu struct sebaiknya dideklarasikan sebagai anggota terakhir dari struktur, dan ukurannya bervariasi atau dapat diubah saat runtime.

Baca Juga:

Catatan: Struct Bahasa C harus berisi setidaknya satu anggota bernama selain anggota array fleksibel lainnya.

Contoh:
struct student
{ int stud_id; /* ukuran 4 byte */
int name_len; /* ukuran 4 byte */
int struct_size; /* ukuran 4 byte */
char stud_name[]; /* ukuran 0 byte */ };

Nilai ukuran dari struct adalah 4 + 4 + 4 + 0 = 12.

Pada contoh potongan kode program tersebut, nilai ukuran atau panjang array dari array "stud_name" adalah tidak pasti dan merupakan bentuk FAM.

struct student *s = malloc( sizeof(*s) + sizeof(char [strlen(stud_name)]) );

Catatan: Saat menggunakan anggota array fleksibel dalam struktur, beberapa konvensi mengenai ukuran sebenarnya dari anggota tersebut telah ditentukan.

Dalam contoh sebelumnya, nilai konvensi adalah anggota "stud_name" sebesar nilai ukuran karakter.

Contoh: perhatikan program struct berikut.
Input : id = 15, name = "Kartik"
Output : Student_id : 15
Stud_Name : Kartik
Name_Length: 6
Allocated_Struct_size: 18


Alokasi memori struct dari contoh program sebelumnya adalah:
struct student *s = malloc( sizeof(*s) + sizeof(char [strlen("Kartik")]));

Representasi struct tersebut adalah:
struct student
{ int stud_id;
int name_len;
int struct_size;
char stud_name[6]; /* character array of length 6 */ };


Implementasi Struct FAM Bahasa C

Contoh:

// Program Bahasa C untuk

// anggota variabel length

// pada struct GCC.

#include<string.h>

#include<stdio.h>

#include<stdlib.h>


// Struct dari tipe student.

struct student

{

int stud_id;


int name_len;


// Digunakan untuk menyimpan

// nilai ukuran dari array

// karakter fleksibel

// stud_name[]

int struct_size;


// Flexible Array Member(FAM)


// variabel panjang array

// harus anggota terakhir dari

// struct.

char stud_name[];

};


// Alokasi memori dan inisialisasi struct.

struct student *createStudent(struct student *s,

int id, char a[])

{


// Alokasi memori menurut

// array yang disediakan

// pengguna dari suatu

// karakter.

s =

malloc( sizeof(*s) + sizeof(char) * strlen(a));

s->stud_id = id;

s->name_len = strlen(a);


strcpy(s->stud_name, a);


// Penetapan ukuran menurut

// nilai ukuran dari stud_name

// yang diduplikasi dari array

// yang disediakan oleh

// pengguna a[].

s->struct_size =

(sizeof(*s) + sizeof(char) * strlen(s->stud_name));

return s;

}


// Mencetak rincian nilai

// student

void printStudent(struct student *s)

{

printf("Student_id : %d\n"

"Stud_Name : %s\n"

"Name_Length: %d\n"

"Allocated_Struct_size: %d\n\n",

s->stud_id, s->stud_name, s->name_len,

s->struct_size);

}


// Driver Code

int main()

{


struct student *s1 = createStudent(s1, 523, "Cherry");


struct student *s2 = createStudent(s2, 535, "Sanjayulsha");


printStudent(s1);

printStudent(s2);


// Ukuran nilai struct student

printf("Size of Struct student: %lu\n",

sizeof(struct student));


// UKuran pada pointer struct

printf("Size of Struct pointer: %lu",

sizeof(s1));


return 0;

}

Output:
Student_id : 523
Stud_Name : SanjayKanna
Name_Length: 11
Allocated_Struct_size: 23

Student_id : 535
Stud_Name : Cherry
Name_Length: 6
Allocated_Struct_size: 18

Size of Struct student: 12
Size of Struct pointer: 8
Important Points:


Catatan:
  • Lokasi memori bersebelahan atau Adjacent digunakan untuk menyimpan anggota struct pada memori tersebut.
  • Pada standar bahasa C sebelumnya, dapat dilakukan proses deklarasi pada sebuah ukuran zero dari anggota array pada lokasi dari sebuah anggota array fleksibel, dimana kompilator GCC dengan standar C89 akan mempertimbangkannya sebagai array dengan ukuran zero atau nol.

Referensi Tambahan:

Artikel ini didedikasikan kepada: Dwi Setyawan, Erlinda Suastika Dewi, Faizal Rifqi Pujaka, Fanny Raka Satria, dan Febrian Calvin Valintino.

5 komentar untuk "Anggota Array Fleksibel Struct Pada Bahasa C"

  1. Apa yang dimaksud dengan anggota array fleksibel pada bahasa C?

    BalasHapus
    Balasan
    1. Anggota array fleksibel pada bahasa C merupakan fitur yang terdapat pada C99, yang digunakan untuk mengakses object melalui panjang variabel.

      Hapus
    2. Anggota array fleksibel dideklarasikan dengan indeks kosong, sehingga nilai array yang disimpan dapat fleksibel.

      Hapus
  2. Apakah array pada Bahasa C dapat dideklarasikan tanpa ditentukan nilai ukurannya?

    BalasHapus
    Balasan
    1. Pengguna dapat mendeklarasikan nilai array tanpa perlu mementukan nilai ukuran untuk dimensi paling kiri dalam banya kondisi kasus.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -