1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C e estruturas

Discussão em 'Programação' iniciada por Simao, 21 de Novembro de 2006. (Respostas: 4; Visualizações: 1028)

  1. Simao

    Simao Power Member

    Bem.. eu estou a dar em maluco aqui com uma cena.

    Eu estou a tentar implementar uma hash table em C, e esta-me a dar um erro que eu tou quase a ir contra uma parede.

    O mais irritante é que em windows funciona, e em linux da-me segment fault.

    Bem para simplificar n vou por aqui a estrutura toda, mas o que tenho é o seguinte:

    Código:
    typedef struct {
    // ...
    
    	int (*hash)(void *, int);
    // ...
    	
    } tHashtableControlMem, *tHashtableControl;
    
    typedef struct {
    	int* indexes; //O Index, que tem o valor da hash
    //...
    	
    	//Informação de controlo
    	tHashtableControl hControl;
    
    //...
    
    } tHashtableMem, *tHashtable;
    
    
    Os //... sao partes cortadas, porque penso que não interessa.

    Depois, ao abrir a hash table tenho:

    Código:
    tHashtable HASHTABLE_create(char *file_name, //... ,(*hash)(void *, int), //....
    {
    	tHashtable table = (tHashtable) malloc(sizeof(tHashtableMem));
    
    //...
    		table->hControl = (tHashtableControl) malloc(sizeof(tHashtableMem));
    
    		table->hControl->hash = hash;
    
    //....
    
    		table->indexes = (int *) malloc(sizeof(int)*table->hControl->tablesize); //Ta a escrever por cima de hash
    	//....
    }
    
    Ora bem, consegui, com o gdb, ver que ele aloca bem o ponteiro para a função hash, do table->hControl->hash = hash, ou seja, logo após esta instrução, eu posso até chamar a função sem problema.

    O que me esta a acontecer é que a instrução seguinte:
    Código:
    table->indexes = (int *) malloc(sizeof(int)*table->hControl->tablesize);
    
    Esta-me a mudar o pointer table->hControl->hash, o que eu acho que é ridiculo, mas ja verifiquei milhentas vezes que é isso que ta a acontecer, ele muda completamente o endereço desse pointer.

    Claro que depois ele n tem acesso a essa zona da memoria.

    Será por o malloc alocar uma zona mt grande da memoria? Funciona no windows....


    Obrigado pela ajuda.
     
    Última edição: 21 de Novembro de 2006
  2. Simao

    Simao Power Member

    Bem akabei de verificar que em windows ele escreve por cima do pointer de outra função
     
  3. Simao

    Simao Power Member

    Bem acabei por resolver o problema, afectando os ponteiros das funçoes só depois do malloc.

    Se alguem souber dizer pk eh ke isto acontece agradecia.

    Obrigado
     
  4. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    table->hControl = (tHashtableControl) malloc(sizeof(tHashtableMem));

    isto não devia ser

    table->hControl = (tHashtableControl) malloc(sizeof(tHashtableControlMem));
     
  5. Simao

    Simao Power Member

    Devia.

    Obrigado, resolveste-me uma porrada de erros :p
     

Partilhar esta Página