C++‘ta sizeof
Anlamak: Neden n
8
‘e Eşit Değil?
C++‘ta dizilerle çalışırken, sizeof
operatörü ile ilgili beklenmedik sonuçlarla karşılaşabilirsiniz, özellikle dizileri fonksiyonlara geçirirken. Bu blog yazısında, sizeof
kullanırken fonksiyon parametreleriyle ilgili yaygın bir kafa karışıklığını keşfedeceğiz ve özellikle şu soruyu yanıtlayacağız: Neden n
, foo()
fonksiyonunda 8
‘e eşit değildir?
Problem
Sorunu açıklayan iki kod parçasını inceleyelim:
Örnek 1: foo()
Fonksiyonu
void foo(char cvalue[8])
{
int n = sizeof(cvalue);
}
Yukarıdaki örnekte, sizeof(cvalue)
çağrıldığında, dizinin boyutunun 8
ile tanımlandığını göz önüne alırsanız, n
‘in 8
eşit olmasını bekleyebilirsiniz. Ancak durum böyle değildir.
Örnek 2: bar()
Fonksiyonu
void bar()
{
char cvalue[8];
int n = sizeof(cvalue);
}
Bu ikinci örnekte, sizeof(cvalue)
gerçekten de 8
‘e eşittir. Peki, neden bu fark var?
Kavramı Anlamak
sizeof(cvalue)
‘nin her iki fonksiyonda neden farklı değerler döndürdüğünü anlamak için, dizilerin C ve C++‘da nasıl ele alındığını netleştirmemiz gerekiyor.
Fonksiyon Parametreleri Olarak Diziler
C veya C++‘da bir diziyi bir fonksiyona geçirirken, aslında dizinin kendisini geçirmiyorsunuz. Bunun yerine, geçirdiğiniz şey dizinin ilk elemanına işaret eden bir göstericidir. Fonksiyon parametresindeki parantezler yalnızca sözdizimsel bir notasyondur ve davranışı değiştirmez; aşağıdaki her iki tanım da eşdeğerdir:
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Bu tanımlarda, cvalue
bir gösterici olarak yorumlanır. Bu nedenle, foo()
içinde sizeof(cvalue)
çağrıldığında, dizi boyutunu değil, gösterici boyutunu verir. Çoğu platformda, bu boyut genellikle 32 bit sistemde 4
bayt ve 64 bit sistemde 8
bayttır, bu nedenle foo()
içinde n
8
‘e eşit değildir.
bar()
İçindeki Doğru Bağlam
Bu duruma karşılık olarak, bar()
içinde cvalue
boyutu 8
olan yerel bir dizi olarak tanımlanmıştır. Bu nedenle, burada sizeof(cvalue)
çağrıldığında, dizinin tamamının boyutunu doğru bir şekilde yansıtır, böylece n
8
‘e eşit olur.
Anahtar Çıkarımlar
- Gösterici Davranışını Anlamak: Dizileri parametre olarak geçirirken, aslında bir gösterici geçiyorsunuz, bu da
sizeof
kullanırken yanıltıcı değerlere yol açabilir. - Yerel Diziler:
sizeof
, bir fonksiyon içinde tanımlanan yerel dizilerin gerçek boyutunu verir ve beklenen çıktıyı sağlar. - Sözdizimsel Şeker: Fonksiyon parametrelerinde kullanılan parantezler, dizi değişkenleri oluşturmaz; aslında bir gösterici ile ilgilendiğinizi belirtir.
Sonuç
C ve C++‘ta dizileri yönetmek zor olabilir, özellikle bu dile yeni başlayanlar için. Göstericiler ile diziler arasındaki farkı anlamak, doğru hesaplama ve hata ayıklama için oldukça önemlidir. Bir fonksiyondayken, dizinin geçirileceği varsayılan bir parametreye uygulanan sizeof
, dizinin boyutu değil, göstericinin boyutunu verir.
Umarım bu açıklama, sizeof
operatörünün fonksiyonlardaki dizi argümanlarıyla ilişkisinde neden n
‘in foo()
içinde 8
‘e eşit olmadığını ama bar()
içinde eşit olduğunu netleştirmeye yardımcı olur. Kod yazarken bu prensipleri aklınızda bulundurun!