Jump to content

Recommended Posts

Posted

Boas passa-se o seguinte, estou a implementar uma biblioteca de funções para a tabela hash. Ao tentar apagar toda a tabela (não tenho teste para esta função) ele corre mas quando é chamada nos testes das outras funções ele dá-me erro...

Aqui está o meu código, se alguém pudesse ajudar agradecia muito...

void tabela_apaga(tabela_dispersao *td)
{
   elemento *temp;
   int i=0;

   for(i=0;i<td->tamanho;i++)
   {

      while(td->elementos[i]!=NULL)
      {
      
      temp=td->elementos[i]->proximo;

      free(td->elementos[i]->string);
      free(td->elementos[i]);

      td->elementos[i]=temp;
      
      }
   }
   free(td->elementos);
   free(td);
}

Fiz algumas alterações mas continua a não funcionar...

O que fiz foi o seguinte utilizei uma função esvazia (que remove todos os elementos das listas e as deixa a NULL). Ficou assim:

void tabela_apaga(tabela_dispersao *td)
{
   
   if(td!=NULL){

   tabela_esvazia(td);

   free(td->elementos);
   free(td);

   }
}

A função esvazia é a seguinte (desconfio que esta não me está a limpar todos os valores das varias listas)

int tabela_esvazia(tabela_dispersao * td)
{
   int i=0;
   elemento *temp;

   if(td==NULL) return TABDISPERSAO_INVALIDA;

   for(i=0;i<td->tamanho;i++)
   {

      while(td->elementos[i]!=NULL)
      {
      
      temp=td->elementos[i]->proximo;

      free(td->elementos[i]->string);
      free(td->elementos[i]);

      td->elementos[i]=temp;
      
      }
   }


   return TABDISPERSAO_OK;
}
Posted

Ora bem, para a implementação desta biblioteca forneceram-nos um teste para as funções. O meu IDE é o visual studio logo utilizei os break points e vi que o erro estava quando ia para a função apaga...

Eu sei o que é uma tabela de dispersão. tens uma struct que eu chamo struct mãe definida por

typedef struct
{
hash_func *hfunc; /* apontador para a função de hash */
elemento **elementos; /* vetor de listas */
int tamanho; /* tamanho do vetor de listas */
} tabela_dispersao;

depois vais ter outra struct definida por typedef struct elem

typedef struct elem
{
char *string;
struct elem * proximo;
} elemento;

o que acontece é que a primeira o vector de listas vai ter varios apontadores para as listas e a partir dai são listas ligadas.

Espero ter sido claro  ?

Posted

Não vejo erros no teu código. A criação da estrutura para um elemento será qualquer coisa do género:

td = malloc(sizeof(tabela_dispersao));
td ->elementos = malloc(sizeof(elemento *) * 1);
td->tamanho = 1;
td->elementos[0] = malloc(sizeof(elemento));
td->elementos[0]->string = malloc(...);
td->elementos[0]->proximo = NULL;

Correcto ? Tem em atenção que o bloco para conter uma string tem de ter mais um byte (ou dois se fôr UTF-16, no Windows) para o zero final.

Se, nalgum lado, escreveres fora das zonas de memória dos 'malloc' irás corromper as estruturas de gestão da alocação de memória e os problemas irão manifestar-se mais tarde ao tentar usar as função de alocação e libertação de memória.

Posted

O erro que me dá é o seguinte:

[shadow=red,left]HEAP CORRUPTION DETECTED: after Normal block (#112) at 0x00F05A80.

CRT detected that the application wrote to memory after end of heap buffer.[/shadow]

Posted

O erro é precisamente o que te disse: estás a escrever fora dum bloco alocado. Isso pode estar a acontecer em qualquer outro código executado antes do ponto em que dá erro. Este exemplo provoca esse tipo de problema :

string = malloc(20);
strcpy(string,"01234567890123456789");  /* Apesar de parecer que metes 20 bytes num buffer para 20, 
                                           estás a meter 21 (a string tem um 0 final implicito) */
free(string);   /* Pode dar erro aqui ou mais tarde, depende da implementação das rotinas de gestão de memória */

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.