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.