C'deki size_t
ile kafam karışıyor. sizeof
operatörü tarafından döndürüldüğünü biliyorum. Ama tam olarak nedir? Bir veri tipi mi?
Diyelim ki bir `for' döngüm var:
for(i = 0; i < some_size; i++)
int i;mi yoksa
size_t i;` mi kullanmalıyım?
1999 ISO C standardına göre (C99),
size_t
işaretsiz bir tamsayıdır tipi en az 16 bit (bkz. 7.17 ve 7.18.3).
size_t
işaretsiz bir veri tipidir çeşitli C/C++ standartları tarafından tanımlanmıştır, örneğin C99 ISO/IEC 9899 standardı,stddef.h
içinde tanımlanmıştır.1 Şunları yapabilir 'nin dahil edilmesiyle daha da ithal edilecektir.stdlib.h
bu dosya dahili olarak altstddef.h
dosyasını içerir.Bu tip,
stddef bir nesnenin boyutu. Kütüphane fonksiyonları boyutları alan veya iade eden onları bekler türünde olmak veya dönüş türüne sahip olmak of
size_t. Ayrıca, en çok sık kullanılan derleyici tabanlı sizeof operatörü bir ile uyumlu sabit değer
size_t`.
Bir çıkarım olarak, size_t
herhangi bir dizi indeksini tutmayı garanti eden bir türdür.
size_tişaretsiz bir türdür. Dolayısıyla, herhangi bir negatif değeri (<0) temsil edemez. Bir şeyi sayarken ve negatif olamayacağından emin olduğunuzda kullanırsınız. Örneğin, [
strlen()][1] bir
size_t` döndürür, çünkü bir dizenin uzunluğu en az 0 olmalıdır.
Örneğinizde, döngü indeksiniz her zaman 0'dan büyük olacaksa, size_t
veya başka bir işaretsiz veri türü kullanmak mantıklı olabilir.
Bir size_t
nesnesi kullandığınızda, aritmetik de dahil olmak üzere kullanıldığı tüm bağlamlarda negatif olmayan değerler istediğinizden emin olmanız gerekir. Örneğin, diyelim ki
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
ve str2
ile str1
uzunluklarının farkını bulmak istiyorsunuz. Bunu yapamazsınız:
int diff = s2 - s1; /* bad */
Bunun nedeni, hesaplama işaretsiz tiplerle yapıldığı için s2 < s1
olsa bile diff
değerinin her zaman pozitif bir sayı olmasıdır. Bu durumda, kullanım durumunuzun ne olduğuna bağlı olarak, s1
ve s2
için int
(veya long long
) kullanmanız daha iyi olabilir.
C/POSIX'te size_t
kullanabilen/kullanması gereken, ancak tarihsel nedenlerden dolayı kullanmayan bazı işlevler vardır. Örneğin, fgets
fonksiyonunun ikinci parametresi ideal olarak size_t
olmalıdır, ancak int
tir.