Falha de segmentação ao executar arquivo.c [RESOLVIDO]

1. Falha de segmentação ao executar arquivo.c [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 04/06/2021 - 14:45h

Boa tarde pessoal, tudo bem ?
Alguem poderia me dar uma força ? Ao eexecutar esse código aparece o erro de falha de segmentação. Mas não vejo nada de errado no código, poderiam me dar uma dica ? Desde já agradeço.

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


struct item 
{
    int x;
    char str[4];
};

struct hashtable
{
    int flag;
    int tamanho;
    struct item *item;
};

struct hashtable *hashtable;

//prototipos ------------------------------------------
void inicia_v(int tam_hash);
int hashcode(int x, int tam_hash);
//void inserir(char *alfanum, int tam_hash);

//main ------------------------------------------
int main()
{
    //int tam_hash = 5;

    inicia_v(5);

    return 0;
}



//funções ------------------------------------------
void inicia_v(int tam_hash) {

    int i;
    for ( i = 0; i < tam_hash; i++)
    {
        hashtable[i].flag = 0;
        hashtable[i].tamanho = 0;
        hashtable[i].item = NULL;
    }

}

int hashcode(int x, int tam_hash)
{
    return (x) % (tam_hash);
}
 



  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 04/06/2021 - 20:25h


DcoderLA escreveu:


perceibi que fatava a alocação de memoria, ainda to aprendendo, então pensei numa abordagem mais simples. O objetivo e implementar hash fechado, mas to na dúvida em conceitos básicos.

Estou tentando agora entender porque so esta sendo inserido a ultima execução de inserir:


Observe parte do código abaixo:
for (i = 0; i < tamhash; i++)
    {
        thash[i] = -1;
    }
} 

Nas linhas acima da função inserir hash, você está resetando os valores do hash para -1 a cada vez que é inserido na thash,ou seja, a cada vez que a função inserir é executada, ela apaga o que tinha adicionado antes com -1 e insere no ínicio o valor da key.

Você tem que dividir melhor essa função. O código acima é na verdade um código de inicialização da variável thash, ou seja, sugiro que crie uma função apenas para definir os valores do vetor como sendo -1 e tire esse código acima de dentro da função inserir.
A função inserir deve fazer somente isso, inserir elementos na thash. Enão, fica melhor dividir as funções em iniciar, inserir e display_table como você fez em parte.

Lembre-se também de executar o free(tablehash) antes do return 0 do main, pois assim você estará liberando a memória previamente alocada.


____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
Uma musiquinha pra relaxar:
https://www.youtube.com/watch?v=5Q02JgxAHu8


3. Re: Falha de segmentação ao executar arquivo.c

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 04/06/2021 - 16:02h

A variável hastable é um ponteiro que não aponta para nenhum conteúdo de memória, e fora que, nem foi alocado memoria pra ela.
Ver na linha com "struct hashtable *hashtable;"
Eu suponho que essa variável você queria que fosse um vetor, mas não foi definido um tamanho para ela, além do caso acima da falta de alocação de memória.

___________________________________________

https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
Uma musiquinha pra relaxar:
https://www.youtube.com/watch?v=5Q02JgxAHu8



4. Re: Falha de segmentação ao executar arquivo.c [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 04/06/2021 - 17:48h


perceibi que fatava a alocação de memoria, ainda to aprendendo, então pensei numa abordagem mais simples. O objetivo e implementar hash fechado, mas to na dúvida em conceitos básicos.

Estou tentando agora entender porque so esta sendo inserido a ultima execução de inserir:



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

int hashcode(int x, int tamhash)
{
    return (x % tamhash);
}

int inserir(int *thash, int key, int tamhash)
{
    int i, index, hashpos;
    //int flag = 0;

    hashpos = hashcode(key, tamhash);

    for (i = 0; i < tamhash; i++)
    {

        thash[i] = -1;
    }

    for (i = 0; i < tamhash; i++)
    {
        index = (hashpos + i*i) % tamhash;

        if(thash[index] == -1)
        {
            thash[index] = key;
            break;
        }
    }
    if(i == tamhash)
    {
        printf("\nElemento não pode ser inserido.\n");
        return 1;
    }
    
    return 0;
}

void display_table(int *thash, int tamhash)
{
    int i;
    printf("\nHash Fechado - Tentativa Quadratica\n");

    for(i = 0; i < tamhash; i++)
    {
        printf("\nv[%d] .... %d", i, thash[i]);
    }
    printf("\n");
}

int main()
{
    int tam_hash = 5;
    int *tablehash;

    tablehash = (int *)malloc(sizeof(int) * tam_hash);

    inserir(tablehash, 2, 5);
    inserir(tablehash, 12, 5);
    inserir(tablehash, 10, 5);
    inserir(tablehash, 50, 5);

    display_table(tablehash, 5);

    return 0;
}
 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts