Sto cercando di implementare un dizionario di parole usando una tabella di hash, quindi ho bisogno di avere globale, e in uno dei miei file di intestazione ho dichiararlovalore non inizializzato è stato creato da uno stanziamento mucchio
extern node** dictionary;
Dove nodo è
typedef struct node
{
char* word;
struct node* next;
} node;
Poi in un altro file in cui funzioni sono definite includo l'intestazione che ha la dichiarazione di dizionario, e anche io aggiungere in cima
node** dictionary;
Poi nella funzione che carica in realtà il dizionario in primo luogo ho allocare memoria per le liste collegate che renderanno la tabella hash
bool load(const char* dict_file)
{
dictionary = malloc(sizeof(node*) * LISTS);
FILE* dict = fopen(dict_file, "r");
if(dict == NULL)
return false;
char buffer[MAX_LEN + 2];
size_dict = 0;
while(fgets(buffer, MAX_LEN + 2, dict) != NULL)
{
node* new_node = malloc(sizeof(node));
int len = strlen(buffer);
new_node->word = malloc(sizeof(char) * (len));
//avoid \n
for(int i = 0; i < len - 1; i++)
new_node->word[i] = buffer[i];
new_node->word[len - 1] = '\0';
new_node->next = NULL;
int index = hash(buffer);
new_node->next = dictionary[index];
dictionary[index] = new_node;
size_dict++;
}
if (ferror(dict))
{
fclose(dict);
return false;
}
fclose(dict);
return true;
}
Così il programma funziona bene, ho poi libera tutta la memoria allocata per archi e nodi e quando eseguo valgrind (un debugger che rileva perdite di memoria) dice che non sono possibili perdite di memoria, ma dice che c'è un errore Il valore non inizializzato è stato creato da un'allocazione dell'heap e mi reindirizza alla riga esatta in cui sono allocare memoria per dictionary
la prima riga esatta della funzione di caricamento che ho scritto sopra.
Cosa sto sbagliando? Immagino che il modo in cui uso globalmente lo dictionary
sia sbagliato, quindi qualcuno può suggerire un altro modo per mantenerlo globale ed evitare questo errore?
Il codice che hai mostrato non riproduce l'errore, quindi è probabilmente a causa di qualcos'altro che non ci hai mostrato. – Rufflewind
Ma l'ho fatto solo perché mi invia solo a questa linea, il seguente codice è solo un file che legge, parola per parola, creazione di un nodo per ogni parola e selezione di ciascun nodo nella lista collegata appropriata (26 di essi , dove il nodo va dipende dalla prima lettera della parola che rappresenta) –
Il problema è nel resto del codice, un motivo particolare per cui non lo si pubblica? Sto cercando di aiutarti, ma è richiesto il resto del codice. –