Memahami Storage Class dalam C: auto, extern, static, register Dijelaskan
Apa itu Storage Class dalam C?
Storage class mendefinisikan cakupan, lokasi, inisialisasi, masa aktif, dan aksesibilitas variabel. Dalam C, setiap variabel tidak hanya bertipe tetapi juga ditugaskan storage class yang menentukan di mana dan bagaimana ia dapat diakses.
Ada empat storage class standar:
- auto – default untuk variabel lokal.
- extern – mendeklarasikan variabel global atau fungsi yang ada dalam berkas lain.
- static – mempertahankan nilai variabel antara pemanggilan dan membatasi visibilitas ke berkas atau fungsi.
- register – memberi petunjuk kepada kompiler untuk menyimpan variabel dalam register CPU untuk akses yang lebih cepat.
Storage Class Auto
Variabel yang dideklarasikan dengan auto (default untuk variabel lokal) hanya ada dalam blok tempat mereka didefinisikan. Mereka dihancurkan saat blok keluar, dan diinisialisasi dengan nilai tidak terdefinisi kecuali ditetapkan secara eksplisit.
int add(void) { int a = 13; auto int b = 48; // auto opsional return a + b; } Demonstrasi cakupan:
#include <stdio.h> int main(void) { auto int j = 1; { auto int j = 2; { auto int j = 3; printf("%d ", j); // mencetak 3 } printf("\t%d ", j); // mencetak 2 } printf("%d\n", j); // mencetak 1 } Output: 3 2 1
Storage Class Extern
Kata kunci extern mendeklarasikan variabel atau fungsi yang didefinisikan dalam unit terjemahan lain. Ini memungkinkan berbagi data di seluruh berkas sumber.
/* main.c */ #include <stdio.h> extern int i; // deklarasi int main(void) { printf("nilai integer eksternal adalah = %d\n", i); return 0; } /* original.c */ #include <stdio.h> int i = 48; // definisi Kompilasi kedua berkas bersama: gcc main.c original.c -o program. Menjalankan ./program menghasilkan:
nilai integer eksternal adalah = 48
Storage Class Static
Variabel statis mempertahankan nilainya selama program berjalan. Mereka dapat digunakan sebagai static lokal atau static cakupan berkas.
- Lokal statis – terlihat hanya di dalam fungsi tetapi bertahan di seluruh pemanggilan.
- Statis cakupan berkas – terlihat hanya dalam berkas tempat dideklarasikan.
/* global static */ static int counter = 7; void next(void) { /* local static */ static int iteration = 13; iteration++; printf("iteration=%d dan counter=%d\n", iteration, counter); } int main(void) { while (counter < 10) { next(); counter++; } return 0; } Output:
iteration=14 dan counter=7 iteration=15 dan counter=8 iteration=16 dan counter=9
Storage Class Register
Gunakan register ketika variabel perlu diakses sering dan dapat muat dalam register CPU. Kompilator mungkin mengabaikan petunjuk jika register langka.
#include <stdio.h> int main(void) { register int weight; /* mencoba mengambil alamat gagal */ // int *ptr = &weight; // kesalahan kompilasi return 0; } Mengompilasi kode menghasilkan:
error: address of register variable 'weight' requested
Tabel Ringkasan
| Storage Class | Konteks Deklarasi | Lokasi Penyimpanan | Nilai Default | Cakupan | Masa Aktif |
| auto | di dalam fungsi/blok | Memori | Tidak terduga | Fungsi/blok | Fungsi/blok |
| register | di dalam fungsi/blok | Register CPU | Tidak terduga | Fungsi/blok | Fungsi/blok |
| extern | di luar semua fungsi | Memori | Nol | Seluruh program | Waktu runtime program |
| static (lokal) | di dalam fungsi/blok | Memori | Nol | Fungsi/blok | Waktu runtime program |
| static (global) | di luar semua fungsi | Memori | Nol | Berkas | Waktu runtime program |
Poin Utama
- Storage class mengontrol visibilitas dan masa aktif variabel.
- Gunakan
auto untuk variabel lokal standar. - Gunakan
register untuk penghitung yang kritis kinerja (tergantung dukungan kompiler). - Gunakan
static untuk mempertahankan status di seluruh pemanggilan fungsi atau untuk membatasi cakupan berkas. - Gunakan
extern untuk berbagi variabel atau fungsi di antara berkas sumber.