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