Mani mulsina size_t
C. Es zinu, ka to atdod ar sizeof
operatoru. Bet kas tieši tas ir? Vai tas ir datu tips?
Pieņemsim, ka man ir for
cilpa:
for(i = 0; i < some_size; i++)
Vai man jāizmanto int i;
vai size_t i;
?
Saskaņā ar 1999. gada ISO C standartu (C99)
size_t
ir neparādītājs vesels skaitlis. vismaz 16 bitu tips (sk. sadaļas 7.17 un 7.18.3).
size_t
ir nenozīmēts datu tips. definēts vairākos C/C++ standartos, piemēram, C99 ISO/IEC 9899 standartā, kas ir definētsstddef.h
.1 Tas var būt var importēt tālāk, iekļaujotstdlib.h
, jo šis fails ir iekšēji pakārtots ietverstddef.h
.Šo tipu izmanto, lai attēlotu objekta lielumu. Bibliotēkas funkcijas kas pieņem vai atdod izmērus, sagaida tos ir jābūt tipa vai atgriešanas tipa no
size_t
. Turklāt lielākā daļa biežāk izmantotās kompilatora operatoram sizeof būtu jānovērtē kā konstantai vērtībai, kas ir saderīga arsize_t
.
No tā izriet, ka size_t
ir tips, kas garantēti satur jebkuru masīva indeksu.
size_t
ir bezzīmju tips. Tāpēc tas nevar atveidot negatīvas vērtības (<0). Jūs to izmantojat, ja kaut ko skaitāt un esat pārliecināts, ka tas nevar būt negatīvs. Piemēram, strlen()
atgriež size_t
, jo virknes garumam jābūt vismaz 0.
Jūsu piemērā, ja cikla indekss vienmēr būs lielāks par 0, būtu lietderīgi izmantot size_t
vai jebkuru citu nenozīmētu datu tipu.
Lietojot size_t
objektu, ir jāpārliecinās, ka visos kontekstos, kuros tas tiek izmantots, tostarp aritmētikā, ir vajadzīgas nenegatīvas vērtības. Piemēram, pieņemsim, ka jums ir:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
un vēlaties atrast str2
un str1
garumu starpību. Jūs nevarat izdarīt:
int diff = s2 - s1; /* bad */
Tas ir tāpēc, ka diff
piešķirtā vērtība vienmēr būs pozitīvs skaitlis, pat ja s2 < s1
, jo aprēķins tiek veikts ar bezzīmju tipiem. Šajā gadījumā, atkarībā no lietojuma veida, iespējams, labāk būtu izmantot int
(vai long long
) kā s1
un s2
.
C/POSIX ir dažas funkcijas, kurās varētu/vajadzētu izmantot size_t
, bet vēsturisku iemeslu dēļ to nedara. Piemēram, fgets
otrajam parametram ideālā gadījumā vajadzētu būt size_t
, bet tas ir int
.