Artikel Terbaru

Fakta Tentang Variabel Length Array Bahasa C

Variabel panjang array merupakan fitur yang terdapat pada Bahasa C yang memungkinkan untuk mengalokasikan array secara otomatis pada stack dengan ukuran variabel tertentu. Bahasa C mendukung penggunaan array berukuran variabel dari standar C99. Contoh, program berikut akan dapat berjalan dengan baik jika dikalompilasi pada bahasa C.

Pada standar C99 atau C11, juga terdapat fitur yang disebut "flexible array members", yang berfungsi sama seperti fungsi variabel panjang array.

void fun(int n)
{
int arr[n];
// ......
}
int main()
{
fun(6);
}


Namun demikian, penggunaan variabel panjang array tidak berlaku pada C++. Pada standar C++11, ukuran array digunakan sebagai ekspresi konstanta. Jadi beberapa contoh program yang telah dibuat sebelumnya pada bahasa C akan bernilai tidak valid jika dibuat dalam C++.

Namun, jika contoh program pada bahasa C yang telah dibuat ke dalam C++ dan dikompilasi menggunakan GCC, maka program tersebut dapat berfungsi dengan baik, karena pada GCC terdapat ekstensi yang mendukungnya.

Catatan: pada tipe terbaru dari C++14, disebutkan bahwa ukuran array merupakan bentuk ekspresi sederhana bukan bentuk ekspresi konstanta.

Contoh:

// Program Bahasa C untuk

// variabel panjang anggota

// dalam struktur GCC sebelum

// C99.

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

 

// Struktur data tipe student.

struct student

{

int stud_id;

int name_len;

int struct_size;

char stud_name[0]

// Variabel panjang array

// harus ditelakkan bagian

// akhir.

};

 

// Alokasi memori dan

// inisialisasi structure.

struct student *createStudent(struct student *s, int id, char a[])

{

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

s->stud_id = id;

s->name_len = strlen(a);

strcpy(s->stud_name, a);

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

return s;

}

 

// Print rincian 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);

// Nilai dari Allocated_Struct_size dalam satuan bytes.

}

 

//Kode Driver.

int main()

{

struct student *s1, *s2;

s1=createStudent(s1, 523, "SanjayDut");

s2=createStudent(s2, 535, "Bonbon");

printStudent(s1);

printStudent(s2);

//size in bytes

printf("Ukuran dari Struct student: %lu\n", sizeof(struct student));

//size in bytes

printf("Ukuran dari Struct pointer: %lu", sizeof(s1));

return 0;

}

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

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

Ukuran dari Struct student: 12
Ukuran dari Struct pointer: 8

Komentar

  1. Apa yang dimaksud dengan panjang array pada bahasa C?

    BalasHapus
    Balasan
    1. Cara prosedural paling sederhana untuk mendapatkan nilai panjang array adalah dengan menggunakan operator sizeof pada bahasa C. Dimana hal yang dilakukan adalah menentukan ukuran array dan membaginya dengan ukuran satu elemen yang berfungsi untuk setiap item dalam array yang memmiliki tipe yang sama beserta ukurannya.

      Hapus
  2. Ada yang bisa memperbaiki bug programnya?

    //C program for variable length members in structures in GCC before C99.
    #include
    #include
    #include


    //A structure of type student
    struct student
    {
    int stud_id;
    int name_len;
    int struct_size;
    char stud_name[0]; //variable length array must be last.
    };


    //Memory allocation and initialisation of structure
    struct student *createStudent(struct student *s, int id, char a[])
    {
    s = (struct student*)malloc( sizeof(*s) + sizeof(char) * strlen(a) );

    s->stud_id = id;
    s->name_len = strlen(a);
    strcpy(s->stud_name, a);

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

    return s;
    }


    // Print student details
    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);

    //Value of Allocated_Struct_size here is in bytes.
    }


    //Driver Code
    int main()
    {
    struct student *s1, *s2;

    s1=createStudent(s1, 523, "Sanjayulsha");
    s2=createStudent(s2, 535, "Cherry");

    printStudent(s1);
    printStudent(s2);

    //size in bytes
    printf("Size of Struct student: %lu\n", sizeof(struct student));
    //size in bytes
    printf("Size of Struct pointer: %lu", sizeof(s1));
    free(s1);
    free(s2);
    return 0;
    }

    BalasHapus
    Balasan
    1. Panjang array dan anggota dinamis adalah dua hal yang berbeda, tetapi keduanya diperkenalkan pada C99.

      Hapus
    2. Kode "implementasi" menunjukkan penggunaan anggota array yang fleksibel tetapi kode tersebut memiliki bug karena strlen tidak menghitung pembatas '\0' dari string C. Jika program tersebut dikompilasi dengan beberapa flag optimasi, maka program akan mengalami masalah. Untuk memperbaiki hal tersebut, malloc untuk struct barus harus dapat membaca.

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

      Hapus
  3. Hello,

    strlen(a) pada kode program menyertakan \0; Pada contoh, string pertama yang diambil adalah 11 byte (0-11) tersebut termasuk \0 atau hanya (a)-1 diambil 10 byte (0-10).

    Jadi, jika menggunakan (1)+1 berarti a[]="hello" berarti strlen(a)+1=6(0-6);

    ????

    BalasHapus
    Balasan
    1. Contoh,

      char a[21] dapat disimpan pada 20 karakter pada variabel a. Demikian juga, untuk menyimpan karakter strlen(a), juga diperlukan strlen(a)+1 byte.

      Hapus
  4. Ketika array telah dideklarasikan pada program bahasa C, bagaimana dapat dilakukan penetapan nilai? akana dapat melakukan pemberian nilai tersebut satu per satu?

    BalasHapus
    Balasan
    1. Ketika menggunakan malloc, maka dapat dilakukan penentuan nilai satu persatu pada array ketika program tersebut telah dijalankan pada bahasa C.

      Hapus
  5. Bagaimana cara untuk membuat array berukuran variabel pada C++?

    BalasHapus
    Balasan
    1. Dapat menggunakan fungsi alokasi C yang dialokasikan pada stack. int *arr=alloca(sizeof(int)*n);

      Dimana sizeof(int)*N byte akan dialokasikan dari stack. Pastikan pula, tidak menggunakan pointer array di luar fungsi tersebut dan juga turunannya.

      Hapus

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D

Hot Artikel!!!

Enkapsulasi pada Java

6 Tahap Utama dalam Melakukan Kompilasi Program Hello World Java

6 Contoh Program Method Overloading pada Java