Jeg blir forvirret med size_t
i C. Jeg vet at den returneres av sizeof
-operatoren. Men hva er det egentlig? Er det en datatype?
La oss si at jeg har en for
løkke:
for(i = 0; i < some_size; i++)
Skal jeg bruke int i;
eller size_t i;
?
I henhold til ISO C-standarden 1999 (C99), er
size_t
et heltall uten fortegn type på minst 16 bit (se avsnitt 7.17 og 7.18.3).
size_t
er en usignert datatype definert av flere C/C++-standarder, f.eks. standarden C99 ISO/IEC 9899, som er definert istddef.h
.1 Det kan importeres videre ved å inkluderestdlib.h
ettersom denne filen internt sub inkludererstddef.h
.Denne typen brukes til å representere den størrelsen på et objekt. Bibliotekfunksjoner som tar eller returnerer størrelser forventer at de er av typen å være av typen eller ha returtypen av typen
size_t
. Videre er de mest hyppigst brukte kompilatorbaserte operatoren sizeof evaluere til en konstant verdi som er kompatibel med konstant verdi som er kompatibel medsize_t
.
Som en implikasjon er size_t
en type som garantert inneholder en hvilken som helst matriseindeks.
size_ter en type uten fortegn. Så den kan ikke representere noen negative verdier(<0). Du bruker den når du teller noe, og er sikker på at det ikke kan være negativt. For eksempel returnerer [
strlen()][1] en
size_t` fordi lengden på en streng må være minst 0.
I ditt eksempel, hvis løkkeindeksen din alltid skal være større enn 0, kan det være fornuftig å bruke size_t
, eller en hvilken som helst annen usignert datatype.
Når du bruker et size_t
-objekt, må du sørge for at i alle sammenhenger det brukes, inkludert aritmetikk, vil du ha ikke-negative verdier. La oss for eksempel si at du har det:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
og du ønsker å finne differansen mellom lengdene på str2
og str1
. Det kan du ikke gjøre:
int diff = s2 - s1; /* bad */
Dette er fordi verdien tilordnet diff
alltid vil være et positivt tall, selv når s2 < s1
, fordi beregningen gjøres med typer uten fortegn. I dette tilfellet, avhengig av brukstilfellet, kan det være bedre å bruke int
(eller long long
) for s1
og s2
.
Det er noen funksjoner i C/POSIX som kunne/burde bruke size_t
, men som av historiske årsaker ikke gjør det. For eksempel burde den andre parameteren til fgets
ideelt sett være size_t
, men er int
.