Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

killezio

Quais as diferenças nestas duas estruturas?

Mensagens Recomendadas

killezio

Vou colocar aqui as duas formas das quais não percebo se existe alguma diferença significante em memória ocupada e até rapidez do programa.

aqui vai a primeira forma de fazer:

typedef struct _exemplo1 * exemplo1;


struct _exemplo1 {
   int *a;
   struct _exemplo1 *seguinte; // poderia trocar esta linha por >exemplo1 * seguinte;< ?
}

exemplo1 criaExemplo1(int *a,exemplo1 e){
   exemplo aux = malloc(sizeof(struct _exemplo1));
   aux->a = a;
   aux->seguinte = e;
   return aux;
}

void destroiExemplo1(exemplo1 e){
   free(e->seguinte);
   free(e);
}

aqui, eu tenho a certeza que quando apago a estrutura com a função destroiExemplo1 liberto totalmente a memória ocupada previamente por ela.

Passando à segunda estrutura

typedef struct _exemplo2 * exemplo2;

struct _exemplo2{
   int a;
   struct _exemplo2 * seguinte;
}

exemplo2 criaExemplo2(int a,exemplo1 e){
   exemplo2 aux = malloc(sizeof(struct _exemplo2)); //auxiliar
   aux->a = a;
   aux->seguinte = e;
   return aux;
}

void destroiExemplo1(exemplo1 e){
   free(e->seguinte);
   free(e);
}

o que está a confundir nesta é ter um inteiro a em vez de um apontador (para o qual poderia fazer free e libertar a sua memória).

Editado por killezio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Não podes utilizar esse 17 directamente. A função criaExemplo1 pede um apontador para um inteiro, e tu estás a dar-lhe um inteiro literal.

Se fizeres isso, o teu programa na realidade estará a tentar ler o número inteiro situado no endereço de memória 17.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

além disso, dás a entender que ainda tens dificuldades em usar essa forma, ao qual não recomendo sem saberes exactamente o que estás a fazer, isto porque podem ocorrer muitos mais problemas do que aparenta.

como exemplo:

#include <stdio.h>

// o teu código

int main(void) {
 exemplo1 exemplo;

 {
   int i = 10;
   exemplo = criaExemplo1(& i, NULL);
 }

 printf("o valor guardado na estrutura : %d\n", * exemplo->a); // ups !!!

 destroiExemplo1(exemplo);

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
killezio

Não podes utilizar esse 17 directamente. A função criaExemplo1 pede um apontador para um inteiro, e tu estás a dar-lhe um inteiro literal.

Se fizeres isso, o teu programa na realidade estará a tentar ler o número inteiro situado no endereço de memória 17.

ok entendi

além disso, dás a entender que ainda tens dificuldades em usar essa forma, ao qual não recomendo sem saberes exactamente o que estás a fazer, isto porque podem ocorrer muitos mais problemas do que aparenta.

como exemplo:

#include <stdio.h>

// o teu código

int main(void) {
 exemplo1 exemplo;

 {
int i = 10;
exemplo = criaExemplo1(& i, NULL);
 }

 printf("o valor guardado na estrutura : %d\n", * exemplo->a); // ups !!!

 destroiExemplo1(exemplo);

 return 0;
}

tens razão ainda ando a tentar perceber isto melhor

Editado por killezio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.