Mendeklarasikan array hanya memesan ruang memori; nilai yang ada di dalamnya belum tentu nol. Inisialisasi memberi nilai awal yang pasti sehingga program berperilaku deterministik. C menyediakan beberapa pola inisialisasi: inisialisasi penuh, inisialisasi sebagian (sisanya otomatis nol), inisialisasi dengan ukuran otomatis dari jumlah elemen, hingga designated initializer yang diperkenalkan di C99 untuk menandai elemen tertentu berdasarkan indeks. Pada chapter ini kita akan menelusuri kelima pola tersebut beserta kebiasaan praktis yang membuat kode lebih ringkas dan aman.

Lima Pola Inisialisasi #

Lima pola inisialisasi array yang umum dijumpai:

  1. Inisialisasi penuh — semua elemen diisi; ukuran array ditulis eksplisit.
  2. Inisialisasi sebagian — hanya sebagian elemen diisi; sisanya otomatis bernilai 0.
  3. Inisialisasi nol sepenuhnya — idiom int arr[N] = {0}; meng-nol-kan seluruh elemen.
  4. Ukuran otomatis — tanda [] kosong, ukuran ditentukan dari jumlah elemen initializer.
  5. Designated initializer (C99) — menandai indeks tertentu dengan [i] = nilai.

Contoh berikut memperlihatkan kelima pola tersebut dalam satu program.

c
#include <stdio.h>

int main(void) {
    /* Inisialisasi penuh */
    int a[5] = {10, 20, 30, 40, 50};

    /* Inisialisasi sebagian: sisanya otomatis 0 */
    int b[5] = {7, 8};

    /* Inisialisasi nol sepenuhnya */
    int c[5] = {0};

    /* Ukuran ditentukan otomatis dari jumlah elemen */
    int d[] = {100, 200, 300, 400};

    /* Designated initializer (C99) */
    int e[5] = {[2] = 99, [4] = 88};

    printf("a = %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
    printf("b = %d %d %d %d %d\n", b[0], b[1], b[2], b[3], b[4]);
    printf("c = %d %d %d %d %d\n", c[0], c[1], c[2], c[3], c[4]);
    printf("d = %d %d %d %d\n", d[0], d[1], d[2], d[3]);
    printf("e = %d %d %d %d %d\n", e[0], e[1], e[2], e[3], e[4]);

    return 0;
}

Output yang Dihasilkan:

text
a = 10 20 30 40 50
b = 7 8 0 0 0
c = 0 0 0 0 0
d = 100 200 300 400
e = 0 0 99 0 88

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int a[5] = {10, 20, 30, 40, 50};): inisialisasi penuh. Lima nilai dipetakan ke indeks 0..4 secara berurutan. Ukuran array (5) cocok dengan jumlah elemen initializer.
  2. Baris 7 (int b[5] = {7, 8};): inisialisasi sebagian. Elemen b[0] = 7, b[1] = 8; elemen b[2], b[3], b[4] otomatis bernilai 0 karena aturan standar C: bila initializer lebih pendek dari ukuran array, elemen sisanya di-zero-initialize.
  3. Baris 10 (int c[5] = {0};): idiom yang sangat umum. Hanya elemen pertama yang eksplisit diisi 0, tetapi karena aturan inisialisasi sebagian di atas, semua elemen sisanya juga menjadi 0. Hasilnya: seluruh elemen bernilai 0.
  4. Baris 13 (int d[] = {...}): ukuran tidak ditulis; compiler menghitung jumlah elemen initializer (4) dan menjadikan ukuran array 4. Ini berguna saat kita ingin menambah atau menghapus elemen tanpa mengubah angka ukuran.
  5. Baris 16 (int e[5] = {[2] = 99, [4] = 88};): designated initializer dari C99. Elemen indeks 2 diisi 99, indeks 4 diisi 88. Elemen lain yang tidak disebutkan otomatis bernilai 0. Ini berguna bila kita ingin menandai beberapa elemen tertentu sementara sisanya tetap nol.

Inisialisasi Array 2D dan Array char sebagai String #

Pola inisialisasi yang sama berlaku untuk array berdimensi lebih tinggi. Untuk array 2D, kita bisa memakai nested braces agar kode lebih terbaca. Untuk array char yang merepresentasikan string, kita bisa langsung memberi string literal yang akan diakhiri karakter nol ('\0') secara otomatis.

c
#include <stdio.h>

int main(void) {
    /* Inisialisasi array char sebagai string */
    char pesan[] = "Halo C!";  /* otomatis berukuran 8 (termasuk '\0') */
    printf("Pesan: %s\n", pesan);
    printf("sizeof(pesan) = %zu\n", sizeof(pesan));

    /* Inisialisasi array 2D dengan nested braces */
    int m[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    printf("m[1][2] = %d\n", m[1][2]);

    /* Inisialisasi 2D sebagian - sisanya nol */
    int grid[3][3] = {
        {1, 2},
        {3}
    };
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", grid[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Output yang Dihasilkan:

text
Pesan: Halo C!
sizeof(pesan) = 8
m[1][2] = 6
1 2 0
3 0 0
0 0 0

Pada contoh di atas, array pesan berukuran 8 byte—tujuh karakter tampak (H, a, l, o, , C, !) ditambah satu byte terminator '\0' yang otomatis ditambahkan compiler. Inisialisasi 2D dengan nested braces mempermudah pembacaan baris per baris; bila inner brace lebih pendek dari jumlah kolom, sisanya otomatis bernilai 0—terlihat pada grid yang baris ke-3 ({0, 0, 0}) tidak disebut sama sekali sehingga seluruh elemennya bernilai 0.

Ringkasan Pola Inisialisasi #

PolaSintaksEfek
Penuhint a[3] = {1, 2, 3};semua elemen diisi
Sebagianint b[5] = {1, 2};dua elemen diisi, tiga sisanya 0
Nol totalint c[5] = {0};semua elemen 0
Ukuran otomatisint d[] = {1, 2, 3};ukuran = 3
Designated (C99)int e[5] = {[2] = 9};hanya indeks 2 berisi 9, lainnya 0

Memilih pola yang tepat membuat kode lebih ringkas dan ekspresif. Gunakan pola penuh bila semua elemen memang berbeda; gunakan {0} bila ingin array bernilai awal nol; gunakan designated initializer bila hanya beberapa elemen yang spesial.