aula 170

De quanta memória uma STRUCT precisa?

Agora que nós já aprendemos em nosso Curso de Programação C como criar nossos tipos de dados com typedef struct, vamos descobrir quanta memória uma STRUCT precisa com o operador sizeof.

Assim como fizemos com os tipos primitivos, podemos utilizar o operador sizeof para descobrir quanta memoria nossa struct precisa, assim:

    Pessoa pessoa;

    printf("%d\n", sizeof(Pessoa)); // tamanho do tipo Pessoa
    printf("%d\n", sizeof(pessoa)); // tamanho de uma variável do tipo Pessoa

Um ponto interessante aqui é que uma estrutura do tipo DataNas ocupará exatamente 12 bytes na memória (3 inteiros vezes 4 bytes cada inteiro). Pela lógica, se colocássemos mais um tipo primitivo do tipo char teríamos então 13 bytes, certo? Bom, pela lógica sim, mas não é isso que acontece.

Quando temos uma estrutura com tipos primitivos do mesmo tipo, como a estrutura DataNas, basicamente o que o computador faz é criar um vetor do tipo int de tamanho 3 (12 bytes). Contudo, quando temos tipos diferentes, por exemplo 3 inteiros e 1 caracter, não é possível criar um vetor para esses 4 dados, pois são de tipos primitivos diferentes. O computador precisa de alguma memória adicional para saber exatamente onde está o vetor de inteiros e onde está a variável do tipo char. É por isso que a quantidade total de memória para uma struct pode ser superior ao somatório da quantidade de memória de cada tipo primitivo que ela possui.

#include <stlio.h>
#include <stdlib.h>

/*
      Aula 170: De quanta memória uma struct precisa?

      Código escrito por Wagner Gaspar
      Abril de 2021
*/
typedef struct{
    int dia, mes, ano;
}DataNas;

typedef struct{
    DataNas dataNas;
    int idade;
    char sexo;
    char nome[100];
}Pessoa;

int main() {
    Pessoa pessoa;
    DataNas data;

    printf("%d\n", sizeof(data));
    printf("%d\n", sizeof(pessoa));

    printf("Digite se nome: ");
    fgets(pessoa.nome, 100, stdin);
    printf("Digite sua idade: ");
    scanf("%d", &pessoa.idade);
    scanf("%c");
    printf("Digite f ou m para o sexo:");
    scanf("%c", &pessoa.sexo);
    printf("Digite sua data de nascimento no formato dd mm aaaa:");
    scanf("%d%d%d", &pessoa.dataNas.dia, &pessoa.dataNas.mes, &pessoa.dataNas.ano);

    printf("Nome: %s\nIdade: %d\nSexo: %c\n", pessoa.nome, pessoa.idade, pessoa.sexo);
    printf("Data de nas.: %d/%d/%d\n", pessoa.dataNas.dia, pessoa.dataNas.mes, pessoa.dataNas.ano);

    return 0;
}

Deixe um comentário

3 × 2 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.