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.