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;
}
