Ir ao conteúdo

Posts recomendados

Postado

Como as variáveis do tipo struct ficam alocadas na memória, por exemplo:

struct livro{
char autor[10];
float preco;
};

//como essas variaveis fica alocado na memória?
struct livro livro1;
strcpy(livro1.autor, "Deitel");
livro1.idade = 320.25;

Aliás, o conceito de struct é muito semelhante a orientação à objetos, ou é impressão minha?

basicamente gostaria de saber o que acontece dentro da memória ao usar struct?

  • Obrigado 1
  • Amei 1
  • Membro VIP
Postado

Até onde eu sabia, as variáveis de uma structs ficam uma seguida da outra na memória ("coladas"). Porém fiz um programa pra testar, elas ficaram próximas, entre a string autor[10] e preco existe 2 bytes vazios que eu não soube explicar. Acredito que seja algo das strings ou char. Porém coloquei mais uma variável para testar, depois da float preco e elas ficaram "coladas" na memória. Criei outras ainda para melhorar o teste. Essa e quando coloquei um char simples, esse espaço "vazio" na memória ocorreu novamente.

O programa está ai caso queira ver:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct livro{
	char autor[10];
	float preco;
	int teste;
	char teste2;
	int teste3;
	float teste4;
	
};
int main(){

//como essas variaveis fica alocado na memória?
	struct livro livro1;
	strcpy( livro1.autor , "Deitel");
	livro1.preco = 320.25;
	printf("tamanho livro.autor(char[10]): %d \n",sizeof(livro1.autor)); // imrpime o tamanho da variavel
	printf("tamanho preco(float): %d \n\n",sizeof(livro1.preco));// imprime o tamanho da variavel
	printf("tamanho char: %d \n\n",sizeof(char));
	printf("tamanho int: %d \n\n",sizeof(int));
	
	printf("endereco autor:%d\n",&( livro1.autor[0] ));// sempre que colocar & antes de uma variavel,
	// esta se referindo ao endereco na memoria da variavel
	printf("endereco preco: %d \n",& livro1.preco);
	printf("endereco variavel teste :%d \n",&livro1.teste);
	printf("endereco variavel char teste2 :%d \n",&livro1.teste2);
	printf("endereco variavel int teste3 :%d \n",&livro1.teste3);
	printf("endereco variavel float teste4 :%d \n",&livro1.teste4);
	return 0;
}

O resultado foi o seguinte:

image.png.439917c1b344c4d350e993e8ab968188.png

 

Eu acreditava que a variável preço deveria estar na posição 6487810.

e a variável teste3 na posição 648721 (já que cada char possui tamanho de 1 byte).

Interessante analisar que os 2 espaços "vazios" são de 2 bytes.

Agora vejo que não sei mais haha, vou esperar contigo pra ver se alguém responde.

 

  • Curtir 2
  • Obrigado 1
Postado
17 minutos atrás, Arthur Vandellay disse:

Eu acreditava que a variável preço deveria estar na posição 6487810.

e a variável teste3 na posição 648721 (já que cada char possui tamanho de 1 byte).

Interessante analisar que os 2 espaços "vazios" são de 2 bytes.

Agora vejo que não sei mais haha, vou esperar contigo pra ver se alguém responde.

 

O compilador faz isso para alinhar a memória, pois é mais rápido mover blocos de memória de determinado tamanho do que mover 1 byte de cada vez.

 

https://0xc0de.wordpress.com/2008/10/31/alinhamento-alignment-e-preenchimento-padding/

https://www.geeksforgeeks.org/data-structure-alignment/

 

A quantidade de bytes adicionados vai depender do compilador e das suas configurações, da plataforma (16, 32 ou 64 bit) e do tipo de variável. 

  • Obrigado 4
  • Membro VIP
Postado

 

5 horas atrás, Alberto_Santos disse:

 

Aliás, o conceito de struct é muito semelhante a orientação à objetos, ou é impressão minha?

 

Basicamente, as structs se parecem muito com as classes da orientação a objetos, mas sem os métodos (funções) inbutidos dentro dela.

adicionado 16 minutos depois
18 minutos atrás, Flávio Pedroza disse:

O compilador faz isso para alinhar a memória, pois é mais rápido mover blocos de memória de determinado tamanho do que mover 1 byte de cada vez.

 

https://0xc0de.wordpress.com/2008/10/31/alinhamento-alignment-e-preenchimento-padding/

https://www.geeksforgeeks.org/data-structure-alignment/

 

A quantidade de bytes adicionados vai depender do compilador e das suas configurações, da plataforma (16, 32 ou 64 bit) e do tipo de variável. 

Cara, incrível isso ai, o texto explicou bem a duvida. Não fazia ideia da existência do alinhamento haha. Obrigado Flávio!

adicionado 17 minutos depois
42 minutos atrás, Arthur Vandellay disse:

Interessante analisar que os 2 espaços "vazios" são de 2 bytes.

Falei coisa errada, na segunda vez que aconteceu o espaço vazio, haviam 3 bytes vazios e não 2.

  • Curtir 2
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!