kuliah#pemrograman-dasar#bahasa-c#tugas-kuliah

Error Umum Bahasa C untuk Pemula dan Cara Membacanya

Enam pesan error bahasa C yang paling sering keluar di kelas pemrograman dasar, dibaca dari pesan mentahnya ke penyebab aslinya, plus yang lolos compile.

Oleh Oscar Ryanda Putra· Diterbitkan 8 Okt 2026· 7 menit baca
Di halaman ini

Pesan error bahasa C hampir selalu menunjuk baris yang salah. Compiler melaporkan tempat dia menyadari ada masalah, bukan tempat kamu membuatnya, dan jarak antara keduanya bisa satu baris atau satu fungsi. Artikel ini membaca enam pesan yang paling sering muncul di praktikum pemrograman dasar, dimulai dari bentuk mentah pesannya lalu menelusuri balik ke penyebabnya. Satu hal perlu dipegang dari awal: compile berhasil bukan berarti program benar.

Kenapa nomor baris pada error sering melenceng satu baris?

Coba kode ini:

#include <stdio.h>

int main(void) {
    int n = 10
    printf("%d\n", n);
    return 0;
}

GCC menjawab:

error: expected ';' before 'printf'

Dan dia menunjuk baris 5, baris printf. Padahal printf tidak salah apa pun. Titik koma yang hilang ada di baris 4.

Logikanya begini. Compiler membaca int n = 10 lalu terus membaca untuk mencari penutup pernyataan. Yang ditemukan berikutnya adalah kata printf, dan di titik itulah dia menyerah. Jadi baris yang dilaporkan adalah baris tempat pembacaan berhenti, bukan baris tempat kesalahan ditulis.

Kebiasaan yang menghemat banyak waktu: untuk error yang mengandung kata expected, lihat satu baris di atas yang dilaporkan lebih dulu. Hal yang sama berlaku untuk kurung kurawal yang lupa ditutup, bedanya laporannya bisa muncul puluhan baris di bawah, kadang di akhir berkas dengan pesan expected declaration or statement at end of input.

Apa arti undeclared first use in this function?

for (int i = 0; i < 5; i++) {
    int total = i * 2;
}
printf("%d\n", total);
error: 'total' undeclared (first use in this function)

Variabel total memang ada, tapi hidupnya habis di kurung kurawal penutup for. Di luar blok itu namanya sudah tidak dikenal. Penyebab kedua yang sama seringnya adalah salah tulis: jumlah dideklarasikan, jumIah yang dipakai, dan huruf i besar terlihat identik dengan huruf L kecil di banyak font terminal.

Cara memeriksanya cepat. Cari nama variabel itu di seluruh berkas. Kalau hanya muncul sekali, berarti salah tulis. Kalau muncul dua kali tapi deklarasinya berada di dalam kurung kurawal yang lebih dalam, berarti masalah ruang lingkup, dan deklarasinya perlu dipindah ke atas blok yang memakainya.

Kalau muncul implicit declaration of function, apa yang lupa ditulis?

#include <stdio.h>

int main(void) {
    printf("%f\n", sqrt(2.0));
    return 0;
}
warning: implicit declaration of function 'sqrt'

Artinya satu saja: compiler tidak pernah melihat keterangan tentang fungsi bernama sqrt, karena #include <math.h> belum ditulis. Jadi pesan ini selalu dibaca sebagai header yang lupa dipasang, bukan sebagai fungsi yang tidak ada.

Bagian berbahayanya ada di nada pesannya. Di compiler versi lama ini hanya peringatan, program tetap jadi, dan compiler diam-diam menganggap sqrt mengembalikan bilangan bulat. Hasil yang keluar lalu menjadi angka aneh yang tidak jelas dari mana. Compiler versi baru sudah menolaknya sebagai error, yang justru lebih baik karena kesalahannya ketangkap sebelum program jalan. Kalau kamu dan temanmu memakai versi compiler berbeda, pesan untuk kode yang sama bisa berbeda tingkat keparahannya.

Peta pendek yang menutup sebagian besar kasus: printf dan scanf butuh stdio.h, sqrt dan pow butuh math.h, strlen dan strcpy butuh string.h, malloc dan atoi butuh stdlib.h.

Kenapa undefined reference muncul padahal headernya sudah di-include?

/usr/bin/ld: main.c: undefined reference to 'sqrt'
collect2: error: ld returned 1 exit status

Pesan ini datang dari tahap yang berbeda. Header hanya memberi tahu compiler bentuk fungsinya. Isi fungsinya ada di pustaka terpisah, dan pustaka matematika harus diminta secara eksplisit:

gcc main.c -o main -lm

Ada satu ciri yang membuat jenis error ini mudah dikenali dan jarang diajarkan. Error dari compiler selalu menyebut nama berkas dan nomor baris. Error dari linker tidak punya nomor baris, dan biasanya diikuti kalimat ld returned 1 exit status. Jadi kalau sebuah pesan tidak menunjuk baris mana pun, berhenti mencari di dalam kode dan periksa perintah compile-nya.

Kenapa program crash Segmentation fault padahal compile-nya bersih?

Ini kasus yang paling sering bikin mahasiswa baru bingung, karena tidak ada satu pun error saat compile.

int n;
scanf("%d", n);

Compile lolos. Begitu program jalan dan kamu menekan Enter, keluar Segmentation fault (core dumped).

Penyebabnya adalah tanda ampersand yang hilang. scanf tidak menerima nilai, dia menerima alamat tempat menyimpan. Dengan menulis n saja, yang dikirim adalah isi n, dan n belum pernah diisi apa pun sehingga isinya angka sisa dari memori. scanf lalu memperlakukan angka sisa itu sebagai alamat memori dan menulis ke sana. Sistem operasi menghentikan program karena alamat itu bukan milik program.

Yang benar:

scanf("%d", &n);

Dua catatan yang melengkapinya. Pertama, compiler sebenarnya bisa memperingatkanmu, tapi hanya kalau diminta. gcc -Wall main.c memunculkan warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int', dan peringatan itu menunjuk tepat ke baris yang salah. Biasakan selalu compile dengan -Wall -Wextra, bukan hanya saat sedang mencari bug.

Kedua, ada pengecualian yang membingungkan. Untuk string, scanf("%s", nama) justru benar tanpa ampersand, karena nama array sudah bernilai alamat elemen pertamanya. Jadi aturannya bukan selalu pakai ampersand, melainkan ampersand untuk variabel tunggal seperti int dan float, tanpa ampersand untuk array karakter.

Error apa yang tidak pernah muncul sebagai error?

Tiga bentuk kesalahan ini lolos compile dan lolos jalan, lalu memberi hasil salah dengan tenang.

Pertama, tanda sama dengan tunggal di dalam kondisi.

if (nilai = 60) {
    printf("Lulus\n");
}

Ini bukan pemeriksaan, ini penugasan. Nilai 60 dimasukkan ke variabel nilai, hasilnya 60 yang dianggap benar, jadi Lulus selalu tercetak apa pun masukannya. Dengan -Wall, GCC bilang warning: suggest parentheses around assignment used as truth value.

Kedua, array diisi melewati batasnya.

int nilai[5];
for (int i = 0; i <= 5; i++) nilai[i] = 0;

i <= 5 menulis ke nilai[5], yang tidak ada. C tidak memeriksa batas array. Akibatnya tidak bisa diprediksi: kadang tidak terjadi apa-apa, kadang variabel lain di sebelahnya berubah nilai, kadang muncul *** stack smashing detected ***. Program yang kelihatan benar di laptop satu bisa crash di laptop lain karena susunan memorinya berbeda.

Ketiga, format printf yang tidak cocok dengan tipe datanya. Mencetak float dengan %d menghasilkan angka acak, bukan error.

Tabel ringkas pesan error dan tempat mencarinya

PesanPenyebab paling seringYang diperiksa
expected ';' before Xtitik koma hilangsatu baris di atas yang dilaporkan
'x' undeclared (first use in this function)salah tulis nama, atau deklarasi ada di blok lainbaris deklarasi variabel itu
implicit declaration of function 'f'header lupa di-includedaftar include di atas berkas
undefined reference to 'f'pustaka belum ditautkanperintah compile, bukan kodenya
Segmentation fault (core dumped)scanf tanpa ampersand, atau indeks di luar batasbaris scanf dan batas array
tidak ada pesan, hasil salahsatu sama dengan di kondisi, format printf kelirukondisi if dan semua printf

Kesalahan yang sering terjadi saat memperbaiki error

  1. Memperbaiki dari error paling bawah. Satu titik koma yang hilang bisa melahirkan sepuluh pesan turunan. Perbaiki yang paling atas, compile ulang, lalu lihat lagi. Sering sembilan sisanya hilang sendiri.
  2. Compile tanpa -Wall. Dua dari enam kasus di atas sebenarnya sudah diperingatkan compiler, cuma peringatannya tidak diminta.
  3. Mengubah kode secara acak sampai pesannya hilang. Error yang hilang tanpa kamu tahu kenapa akan kembali di tugas berikutnya dalam bentuk lain.
  4. Menambahkan cast untuk membungkam warning. Cast menghilangkan pesan, bukan masalahnya.
  5. Menganggap tidak ada error berarti sudah benar. Uji dengan masukan yang menyusahkan: nol, bilangan negatif, satu elemen, dan batas atas yang disebut di soal.

Kalau kamu sedang menyusun catatan praktikum, pesan error lebih berguna dicatat berpasangan dengan penyebabnya daripada dicatat sebagai daftar istilah. Cara menyusun catatan seperti itu dibahas di cara membuat catatan kuliah efektif. Untuk tugas yang menuntut rancangan sebelum kode, urutan dari deskripsi ke pseudocode ke program ada di flowchart dan pseudocode tugas algoritma. Menjelang ujian praktikum, pola belajar yang dipakai di strategi belajar UAS dan UTS mahasiswa bisa dipakai juga untuk mengulang kasus error.

Apakah warning boleh diabaikan?

Secara teknis program tetap jadi. Tapi dua dari tiga bug yang paling mahal di tulisan ini muncul sebagai warning lebih dulu. Perlakukan warning sebagai error yang belum sempat terjadi.

Kenapa program saya jalan di laptop teman tapi crash di laptop saya?

Biasanya karena ada akses memori di luar batas. Perilakunya bergantung pada susunan memori dan versi compiler, jadi kode yang sama bisa diam di satu mesin dan crash di mesin lain. Beda versi compiler juga mengubah apakah sesuatu dilaporkan sebagai warning atau error.

Apa bedanya error compile dan error runtime?

Error compile terjadi sebelum program ada, dan pesannya menyebut berkas serta nomor baris. Error runtime terjadi saat program jalan, dan pesannya tidak menyebut baris sama sekali. Segmentation fault adalah error runtime, karena itu tidak ada gunanya mencari nomor baris di pesannya.

Perintah compile apa yang sebaiknya dipakai untuk tugas kuliah?

gcc -Wall -Wextra main.c -o main cukup untuk hampir semua tugas pemrograman dasar, ditambah -lm kalau memakai math.h. Dua flag pertama tidak mengubah program yang dihasilkan, hanya menambah pesan yang kamu lihat.

Kenapa pesan error di IDE berbeda dengan di terminal?

IDE sering memakai versi compiler dan kumpulan flag bawaannya sendiri, dan beberapa menyembunyikan warning secara bawaan. Kalau asisten praktikum menilai dengan compile di terminal, uji kodemu di terminal juga sebelum mengumpulkan.

Bagaimana cara memastikan program benar kalau tidak ada error?

Siapkan dua sampai tiga kasus uji dengan jawaban yang kamu hitung manual lebih dulu, lalu bandingkan dengan keluaran program. Ini satu-satunya cara memisahkan program yang benar dari program yang kebetulan tidak crash.

Artikel Terkait

Siap taklukkan UTS, UAS, dan skripsi?

Gabung gratis di Pintarly. Ubah catatan kuliahmu jadi rangkuman, flashcards, dan kuis otomatis, plus AI tutor yang siap bantu kapan aja butuh.