Ir para conteúdo
Fórum Script Brasil
  • 0

Struct


Math_naVeia

Pergunta

Eu estava com uma dúvida sobre a disposição de membros de uma estrutura na memória. Por exemplo, um array tem um elemento ao lado do outro na memória, e eu queria saber como era isso com estruturas, se é igual ou se os membros estão em locais aleatórios. Então usei esse programa em c++ :

#include <iostream>
using namespace std;

struct product {
     int weight;
     float price;
};

product apple;

int main ()
{
cout << &apple << endl;
cout << &apple.weight << endl;
cout << &apple.price << endl;

return 0;
}

E obtive a resposta :

0x804a0d0
0x804a0d0
0x804a0d4


Então os membros de uma estrutura ficam lado a lado na memória, né ? E o endereço do objeto se refere ao endereço do primeiro membro, certo ?

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Se a estrutura tiver tipos de dados que não sejam ponteiros sim! Caso a estrutura tenha ponteiros como membro então somente o ponteiro estará dentro, o dado apontado estará em outra parte obviamente. Pense em uma estrutura como se fosse um array de dados de diferente tipos. Um array tem os dados idênticos, por isso podemos usar índices, por que ao incrementar o ponteiro o mesmo vai ir "pulando" X bytes que sempre serão iguais, porem na estrutura os dados podem ter muitos tipos diferentes, então ao não saber o tamanho dos dados não podemos pular de um dado a outro com aritmética de ponteiros por exemplo. Porem falando, a estrutura de uma struct e de um array são parecidas, se poderia definir como um conjunto de dados que são apontados por um ponteiro ao seu primeiro elemento, mas um array é um conjunto de dados do mesmo tipo, e a struct não, mas ambos são apontados por um ponteiro ao seu primeiro elemento, e todos os dados são consecutivos, menos os que são apontados, esses estarão em outra parte, cuidado ao enviar estruturas a arquivos que contenham ponteiros porque certamente o dado apontado não irá a parar ao arquivo.

Link para o comentário
Compartilhar em outros sites

  • 0

todos os comandos que começam com # é trabalho para o pré-processador. Que quer dizer isso? Que quando fizer um define como o que você mencionou( #define PI 3.14159265 ) e chegar por exemplo a algo como float valor = PI;, o que acontece é que em tempo de compilação o pré-processador troca tudo o que for "PI" por 3.14159265, então na realidade esse 3.14159265 não passa de uma "literal", tem o mesmo valor float valor = PI que float valor = 3.14159265, não é atribuído memória alguma para esse define.

Sobre o  de "definição de struct" não entendo bem ao que você se refere. Talvez você quer dizer "definição de um novo tipo"? Algo como os typedefs? Se for isso são temas completamente diferentes. A linguagem C permite a criação de novos tipos de dados a partir de tipos primitivos, se agrupamos vários dados em uma struct podemos usar um typedef para criar uma nova definição de tipo especificada pelo programador. Não sei se é bem isso o que você se refere, vamos com exemplos.

struct dados{
int n;
};
Definição de estrutura anterior, não ocupa memória, somente "modelamos" a aparência dos dados. Ou melhor explicado... com a definição de uma estruct queremos dizer ao programa o tamanho que vai ocupar um objeto do tipo "dados" na memória. Quando criamos um objeto dados, ou seja, quando fizer struct dados d;, é neste momento que criamos um conjunto de variáveis em memória que vai ocupar um tamanho de " struct dados". O fato de definir estruturas não consumirá espaço, e sim o fato de criar copias desses dados na memória quando criamos um objeto do tipo dados.

typedef struct {
int n;
}dados;

Neste caso sim consume memória, pois trata-se de 2 comandos e não de um. Tem claro que a ultima forma de declarar uma estrutura é equivalente a:
//definimos a forma de Dados
struct Dados{
int n;
};
//definição de um novo tipo
typedef struct Dados data;

//momento em que criamos um conjunto de dados na memória, agora já ocupa espaço em memória.
data dados;

//troca todas as entradas do arquivo onde estiver escrito dados por data. É óbvio que deveria ser feito um typedef anteriormente.
#define dados data;

Espero ter deixado claro.




 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...