Basis van programmeren in C

struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));

Neem een gebruikelijke omgeving aan waarin char 1 byte en int 4 bytes is, en int op adressen wordt geplaatst die een veelvoud van 4 zijn. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?

  1. A6 6
  2. B9 6
  3. C12 8
Antwoord en toelichting tonen

Antwoord: C. 12 8

int wordt geplaatst op een adres dat een veelvoud van 4 is, dus in struct S worden na c 3 bytes opvulling (padding) ingevoegd, staat i op byte-offset 4 en d op offset 8. Bovendien wordt de grootte van de hele struct naar boven afgerond op een veelvoud van 4, zodat i in elk element van een array van structs goed uitgelijnd blijft; na de 9 bytes worden dus 3 bytes toegevoegd, wat 12 bytes geeft. In struct T volgen c en d op i, samen 6 bytes, wat naar boven wordt afgerond op 8 bytes. Door de members van het grootste naar het kleinste type te ordenen, wordt de padding kleiner.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. uint32_t en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  2. Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?
  3. Wat is de uitvoer als de bovenstaande code, die de met #define gedefinieerde macro SQUARE gebruikt, wordt uitgevoerd?
  4. Het headerbestand sensor.h is geschreven zoals hierboven. Wat is het doel van de drie regels #ifndef, #define en #endif?
  5. Wat is de uitvoer als de bovenstaande code binnen de functie main wordt geschreven en uitgevoerd?