Memahami sizeof
di C++: Mengapa n
Tidak Sama Dengan 8
?
Saat bekerja dengan array di C++, Anda mungkin menemui hasil yang tidak terduga terkait dengan operator sizeof
, terutama saat meneruskan array ke fungsi. Dalam pos blog ini, kita akan mengeksplorasi kebingungan umum yang muncul ketika menggunakan sizeof
dengan parameter fungsi, khususnya menjawab pertanyaan: Mengapa n
tidak sama dengan 8
di fungsi foo()
?
Masalah
Mari kita periksa dua potongan kode yang menggambarkan masalah ini:
Contoh 1: Fungsi foo()
void foo(char cvalue[8])
{
int n = sizeof(cvalue);
}
Dalam contoh di atas, ketika kita memanggil sizeof(cvalue)
, Anda mungkin berharap n
sama dengan 8
, karena array didefinisikan dengan ukuran 8
. Namun, ini tidak terjadi.
Contoh 2: Fungsi bar()
void bar()
{
char cvalue[8];
int n = sizeof(cvalue);
}
Dalam contoh kedua ini, sizeof(cvalue)
sama dengan 8
. Jadi, mengapa perbedaannya?
Memahami Konsep
Untuk memahami mengapa sizeof(cvalue)
mengembalikan nilai yang berbeda di setiap fungsi, kita perlu menjelaskan bagaimana array diperlakukan di C dan C++.
Array sebagai Parameter Fungsi
Ketika Anda meneruskan array ke fungsi di C atau C++, Anda sebenarnya tidak meneruskan array itu sendiri. Sebaliknya, yang Anda teruskan adalah pointer ke elemen pertama dari array. Bracket yang digunakan dalam parameter fungsi hanyalah notasi sintaksis, yang tidak mengubah perilaku—kedua deklarasi berikut setara:
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Dalam semua deklarasi ini, cvalue
diartikan sebagai sebuah pointer. Oleh karena itu, ketika Anda memanggil sizeof(cvalue)
di dalam foo()
, itu memberikan ukuran pointer, bukan ukuran array. Di sebagian besar platform, ukuran ini biasanya 4
byte pada sistem 32-bit dan 8
byte pada sistem 64-bit, itulah sebabnya n
tidak sama dengan 8
di foo()
.
Konteks yang Benar di bar()
Sebaliknya, di dalam bar()
, cvalue
didefinisikan sebagai array lokal dengan ukuran 8
. Oleh karena itu, ketika sizeof(cvalue)
dipanggil di sini, ukuran yang sebenarnya dari seluruh array tercermin dengan benar, menghasilkan n
sama dengan 8
.
Poin Penting
- Memahami Perilaku Pointer: Ketika meneruskan array sebagai parameter, yang sebenarnya Anda teruskan adalah pointer, yang dapat menghasilkan nilai yang membingungkan saat menggunakan
sizeof
. - Array Lokal:
sizeof
memberikan ukuran sebenarnya dari array lokal yang didefinisikan dalam fungsi, memberikan hasil yang diharapkan. - Gula Sintaksis: Bracket dalam parameter fungsi tidak membuat variabel array tetapi menunjukkan bahwa Anda menangani pointer.
Kesimpulan
Menangani array di C dan C++ bisa rumit, terutama bagi mereka yang baru mengenal bahasa ini. Memahami perbedaan antara pointer dan array sangat penting untuk perhitungan dan debugging yang akurat. Ingat bahwa ketika Anda berada di dalam fungsi, sizeof
yang diterapkan pada parameter yang dianggap sebagai array memberikan ukuran pointer, bukan ukuran array yang Anda niatkan untuk diteruskan.
Semoga penjelasan ini memberikan pencerahan tentang perilaku operator sizeof
terkait argumen array dalam fungsi, menjelaskan mengapa n
tidak sama dengan 8
di fungsi foo()
tetapi sama di bar()
. Ingat prinsip-prinsip ini saat Anda melakukan coding!