Possible en double:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?
Extra bytes when declaring a member of a struct as uint32_tTaille de l'opérateur renvoie une taille incorrecte?
Pour une raison quelconque, l'opérateur sizeof
retourne une taille bogus pour cette structure (48
au lieu de 40
):
typedef struct mbdb_file_info {
uint16_t mode;
uint32_t unk0;
uint32_t unk1;
uint32_t user_id;
uint32_t group_id;
uint32_t time0;
uint32_t time1;
uint32_t time2;
uint64_t length;
uint8_t flag;
uint8_t property_count;
} mbdb_file_info;
Voici donc un test simple:
printf("%ld %ld %ld %ld: %ld", sizeof(uint8_t),
sizeof(uint16_t),
sizeof(uint32_t),
sizeof(uint64_t),
sizeof(mbdb_file_info));
qui imprime:
1 2 4 8: 48
Comment cela se produit? Si vous ajoutez toutes les tailles ensemble, vous obtenez 40
, pas 48
. D'où vient le 48
?
Et si c'est un peu bizarre x86-64
perk, comment puis-je m'assurer que tous les champs des structures occupent les montants que je veux qu'ils occupent (je lance un tas d'octets à cette structure)?
Oh, alors j'ai besoin de 'struct volatile '? –
Vous devez ajouter '__attribute __ ((packed))'. –
@S'il vous plaît noter qu'il est possible que l'utilisation de 'packed' * peut affecter les performances de votre programme. Un accès mémoire non aligné peut être plus coûteux qu'un accès aligné et peut faire une différence mesurable dans une boucle. –