Standart C Programlama Dili


5.4. sizeof İşleci

C dilinde bir anahtar sözcük ile ifade edilen bir işleç de sizeof’tur. Bir fonksiyon değildir; diğer tekli önek işleçler ile aynı önceliğe sahip olan ve sağdan sola birleşme özelliği gösteren bir tekli işleçtir. Genelde, ya bir değişkene yada bir tipe uygulanır. Bu işleç işlenenin tipinden olan bir değişkenin bellekte tutacağı bayt sayısını (bir değişmez) döndürür. Bir önceki kısmın değişken tanımlamalarını kullanan örnekler aşağıda verilmiştir:

printf("%zu %zu %zu %zu %zu\n", sizeof i,  sizeof a,
  sizeof s1,  sizeof z[3],  sizeof 1.0);

printf("%zu %zu %zu %zu %zu\n", sizeof(int),  sizeof(float),
  sizeof(double),  sizeof(int *),  sizeof(kompleks[3]));

printf("%zu %zu %zu %zu %zu\n", sizeof(vektor),  sizeof(long[4]),
  sizeof(struct { char *c; vektor v[5]; }),
  sizeof *s1,  sizeof(a[1]));

Bu deyimler farklı sistemlerde farklı çıktılar görüntüleyecektir. Sistemimizde çıktı şöyledir:

2 192 8 8 8
4 4 8 8 24
24 32 128 1 24

Bunun anlamı, int değişkenlerinin 4 bayt, float değişkenlerinin 4 bayt, double değişkenlerinin 8 bayt ve gösterge değişkenlerinin 8 bayt tuttuğudur. Her gerçekleştirmede sizeof(char)’ın 1 olduğu tanımlanmıştır. Diğer sayıları kendiniz doğrulamaya çalışın. Bir long kaç bayttır?

sizeof’un değerinin derleme zamanında belirlendiğine dikkat edin, böylece sizeof bir değişmez ifadenin kullanılmasına izin verilen yerlerde kullanılabilir. Standarda göre sizeof işlecinin verdiği sayının int olması beklenmemelidir; gerçekleştirmeye bağlı olarak long veya herhangi bir uygun tamsayı tipi olabilir. Bu (unsigned olan) tip standart başlık dosyası stddef.h’de size_t ismi ile tanımlanmıştır.

size_t tipindeki bir değeri bastırmak için iki yöntem vardır: (1) Bu sayıyı printf’e geçirmeden önce bir kalıpla, örneğin, long’a çevirip, long için olan dönüşüm tanımlamasını (%ld) kullanmak. (2) Bu tip için, printf tarafından tanınan ve özel bir uzunluk belirteci olan z harfini kullanmak. Yukarıdaki örnekte de gördüğünüz gibi, %zu dönüşüm tanımlaması beklenen argümanın size_t boyutunda olduğunu belirtir. Kısım 1.7’de bahsedilmeyen bu uzunluk belirteci dışında, ileride bahsedilecek t uzunluk belirteci de bulunmaktadır.

sizeof ile ilgili bir sözdizimsel ayrıntı da, bir ifade yerine bir tipe uygulandığında tipin parantezler içine alınması gerektiğidir.