[SOLVED] Curiosidade C ANSI

Boas,
Alguém me pode explicar este fenómeno?

Código:
#include <stdio.h>
#include <stdlib.h>

int main() {
    
    struct a {
        char s1[5];
        int i;
        char s2[5];
    };
    
    struct b {
        int i;
        char s1[5];
        char s2[5];
    };
    
    struct a va[10];
    struct b vb[10];

    
    printf("\n\n\n");
    printf("struct a (%lu) {\n\tchar s1[5](%lu);\n\tint i(%lu);\n\tchar s2[5](%lu);\n};\n\n",
    (long unsigned)sizeof(va[0]), (long unsigned)sizeof(va[0].s1), (long unsigned)sizeof(va[0].i) , (long unsigned)sizeof(va[0].s2) );
    
    printf("struct b (%lu) {\n\tint i(%lu);\n\tchar s1[5](%lu);\n\tchar s2[5](%lu);\n};\n\n",
    (long unsigned)sizeof(vb[0]), (long unsigned)sizeof(vb[0].i), (long unsigned)sizeof(vb[0].s1) , (long unsigned)sizeof(vb[0].s2) );
    
    printf("sizeof(va) (%lu)\n", (long unsigned)sizeof(va));
    printf("sizeof(vb) (%lu)\n", (long unsigned)sizeof(vb));
    
    
    return 0;
}
e eis o output:

Código:
%%%%$ ./main 


struct a (20) {
    char s1[5](5);
    int i(4);
    char s2[5](5);
};

struct b (16) {
    int i(4);
    char s1[5](5);
    char s2[5](5);
};

sizeof(va) (200)
sizeof(vb) (160)
Agradeço quaiquer sugestões para me ajudar a compreender isto.

Nota: Para quem não percebe o que se está a passar, ambas as estrutura, de acordo com os meus conhecimentos e de acordo com as variaveis que cada uma contém, deviam ocupar apenas 14 bytes. No entanto uma ocupa 16 outra ocupa 20. Porquê?
 
Última edição:
Deixa ver se percebi bem, o que se passa é que o tamanho das struct a e b não coincide com o seu conteúdo, têm maior tamanho que o seu conteúdo.

É isto? Também não sei a resposta.
 
Tem a ver com o alinhamento de dados em memória.
Se um tipo de dados requer k bytes, o primeiro byte do endereço deve ser múltiplo de k.
As struct devem começar com um endereço que é múltiplo do tamanho do seu maior elemento

char[5] -> próximo elemento é int, portanto vais ter 3 bytes livres a seguir a este array (5+3=8)
int -> 4 bytes
char[5] -> a próxima struct também vai começar num múltiplo de 4 (o maior elemento é um int), por isso tens mais 3 bytes livres
TOTAL: 20 bytes

int -> 4 bytes
char[5] -> próximo elemento é um char, que não tem restrições de alinhamento, por isso ocupa 5 bytes
char[5] -> a próxima struct também vai começar num múltiplo de 4 (o maior elemento é um int), por isso tens mais 2 bytes livres
TOTAL: 16 bytes


EDIT: mais informações aqui (últimas páginas do pdf): http://gec.di.uminho.pt/lcc/sc/Slides ISA/ISA_5.pdf
 
Última edição:
Back
Topo