Jump to content

Quais as diferenças nestas duas estruturas?


Recommended Posts

Posted (edited)

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).

Edited by killezio
Posted

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.

Posted

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
Posted (edited)

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

Edited by killezio

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.