Bästa svaret
Den exakta sekvensen sizeof(struct)
är ett kompileringsfel i C. Jag antar att du frågar hur du bestämmer storleken på en viss struct
.
Det svaret inte tillhandahålls direkt av definitionen i C-språket. Det är snarare en funktion av ABI för din specifika målarkitektur. (ABI står för Application Binary Interface.)
C-språkstandarden innehåller några breda regler. Om du till exempel har en struct
med flera medlemmar, kommer den första medlemmen att dela en adress med struct
, och efterföljande medlemmar kommer vara på högre adresser.
Bitfält har sina egna regler. Jag kommer inte att sammanfatta dem här.
För en första order kommer storleken på en struct
att vara åtminstone lika stor som summan av medlemmarnas storlek (ignorerar bitfält för tillfället). Medlemmar kan ha inriktningsbegränsningar, och om de gör det kan miljön införa utfyllning mellan medlemmar och utfyllnad i slutet av struct
.
Tänk på följande struct
på en arkitektur som kräver 8-byte-justering för double
-värden:
struct fun {
char a;
double b;
char c;
};
Enligt reglerna för C-språket, b
måste ha en högre adress än a
i alla fall av struct fun
. På samma sätt måste c
ha en högre adress än b
.
Som ett resultat upptar denna struktur sannolikt 24 byte på grund av inriktningsbegränsningarna för b
för den arkitekturen. Samma struktur kan bara kräva 16 byte i en arkitektur som bara kräver 4 byte-justering för double
.
Tro mig inte?
Se själv:
I slutändan måste du konsultera din målplattforms ABI för att förstå hur en struct
packas tillsammans för det målet.
Eller använd bara sizeof
om du personligen inte bryr dig, men din kod behöver bry sig.
Svar
Hur beräknar jag värdet på sizeof (struct) i C?
Det gör du inte. Kompilatorn gör det.
För det första är sizeof(struct)
ett syntaxfel. Du frågar förmodligen hur man bestämmer storleken på en strukturtyp eller ett objekt av en sådan typ. Det är viktigt att vara exakt. (Jag förstår att Quoras borttagning av frågedetaljer gör det svårt.)
Låt oss säga att du har en strukturtyp med namnet struct foo
och / eller ett objekt av den typen som heter obj
. Storleken på typen är sizeof (struct foo)
, och storleken på objektet (vilket är detsamma som storleken på dess typ) är sizeof foo
. (Parenteserna krävs i det första fallet och inte i det andra. Det finns faktiskt två olika former av operatorn sizeof
. Den ena tillämpas på ett parentesstypnamn, den andra på en uttryck, vilket ofta men inte alltid är ett objektnamn.)
Du kanske tänker att du kan beräkna storleken på en struktur genom att lägga till storlekarna på dess medlemmar. Du kan inte. Kompilatorer kan och infogar stoppning mellan medlemmarna, och eventuellt efter den sista medlemmen, för att uppfylla kraven på inriktning. Storleken på en struktur är åtminstone summan av storlekarna på dess medlemmar, men om du behöver storleken på hela strukturen, använd bara sizeof
. Det är vad det är för.