1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[SOLVED] Curiosidade C ANSI

Discussão em 'Programação' iniciada por Curraleiro, 1 de Março de 2009. (Respostas: 4; Visualizações: 870)

  1. 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: 1 de Março de 2009
  2. [knap]

    [knap] Power Member

    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.
     
  3. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    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: 1 de Março de 2009
  4. Hmm percebi!
    Muito obrigado!
     

Partilhar esta Página