PR03 - malloc sempre no mesmo endereço?

PR03 - malloc sempre no mesmo endereço?

por Bruna Thalenberg -
Número de respostas: 3

Ois,

misteriosamente, quando inseríamos novos itens na nossa symbol table, eles estavam sobrescrevendo os que lá já estavam. Investigando mais de perto, (imprimindo os endereços de memória depois de um malloc), vi que sempre que críavamos um novo nó para nossa lista de ligada, ele apontava pra um mesmo endereço.

O que pode estar acontecendo? Como resolver?

trecho relevante:


EntryData *dat = stable_find(table, key);
if (dat == NULL) {[...]
Node *n = malloc(sizeof(Node));
printf("%p\n", (void*);
}


resultado:


0x7ffd59ce7280
0x7ffd59ce7280
0x7ffd59ce7280

Em resposta à Bruna Thalenberg

Re: PR03 - malloc sempre no mesmo endereço?

por José Coelho de Pina -

Oi Bruna,

  O que pode estar acontecendo?

Não tenho ideia.

Eu faria uma versão minimal de um main(), colocando chaves hardcoded, stable_find(table, "oi") para tentar descobri o que está acontecendo.
Eu tambem coloraria um printf("size(Node)=%ld", sizeof(Node)); (Hmm, não lembro se é %d ou %ld ou ...).
Quanto menos comandos nessa versão minimal melhor.
Unit test sem loop. piscando

Eu também testaria se o malloc() deovolveu NULL.

  Node *p = malloc(size *p);
  if (p == NULL) 
  { 
      fprintf(stderr,"Socorro! malloc() retornou NULL!");
      exit(EXIT_FAILURE);
  }

Quando você descobrir qual foi o problema, por favor, nos diga.

 

Em resposta à Bruna Thalenberg

Re: PR03 - malloc sempre no mesmo endereço?

por Bruna Thalenberg -

O bug era mera burrice:

Ao invés de imprimir usando 

printf("%p\n", (void*) &n);

(que era pra ser o código no meu post mas por algum motivo veio errado)

era necessário usar 

printf("%p\n", (void*) n);

O erro estava em outro lugar, mais especificamente na leitura das palavras, que eram sempre armazenadas no mesmo char* e, logo, eram sempre sobrescritas pelas seguintes, fazendo com que a tabela tivesse todas as strings iguais.