Ich konnte keine Lösung für das Problem unten finden. Ich habe zu oft danach gesucht, aber ich weiß immer noch nicht, wie ich es lösen soll.Realloc Fehler: realloc(): ungültig nächste Größe
Was ich zu tun habe: Ich muss ein Programm machen, das ein Archiv mit zufälligen Tweets liest und es in einer Matrix speichert. Danach sollte dem Benutzer ermöglicht werden, eine Liste von Wörtern zu schreiben. Das Programm muss jedes Wort lesen und dem Benutzer die Tweets zeigen, die das Wort enthalten.
Meine Lösung: Nachdem das Programm das Archiv in einer Matrix liest, geht jedes Wort in den Tweets zu einer Hashfunktion. Die Hash-Funktion teilt mit, wo der Index des Tweets in der Matrix in eine Hash-Tabelle gehen soll. Die Hash-Tabelle funktioniert wie eine Matrix aus ganzen Zahlen. Jeder Index der Hash-Tabelle hat einen Zeiger auf ein Array mit den Indizes der Matrix, in der sich die Tweets befinden.
Das Problem: Die Realloc-Funktion funktioniert nicht sehr gut. Nach einigen Einfügungen, stoppt die Funktion des Programms und zeigt einen Fehler: * Fehler in `./a.out ': realloc(): ungültig nächste Größe: 0x00000000023f2460 *
Ich denke, es ist, weil die Funktion versucht, Zugang zu einer ungültigen Position der Hash-Tabelle, aber ich weiß es nicht genau.
Die Tweets im Archiv sieht so aus: "14,0, jb isnt zeigt in Australien nicht mehr!". Jede Zeile enthält 3 Informationen, die durch ein Komma getrennt sind.
Mein "int main()" -> Liest das Archiv und ruft die Funktion, die den Index der Matrix in die Hash-Tabelle einfügt:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAT_SIZE 10000
#define TABLE_SIZE 10000
int main(){
FILE *fp;
char str[300];
char matriz[MAT_SIZE][300];
char *token;
int **TabelaHash;
int i, j, pos, verifica;
pos = i = j = 0;
TabelaHash = criaHash();
fp = fopen("corpus.csv","r");
if(fp == NULL)
{
printf("Erro ao abrir o arquivo!");
exit(1);
}
while(fgets(str, 300, fp) != NULL)
{
token = strtok(str, ",");
token = strtok(NULL, ",");
token = strtok(NULL, ",");
removeEspacosIniciais(matriz, token, pos); // Remove the initial spaces of the string and saves in the matrix
token = strtok(matriz[pos], " ");
while(token != NULL){
verifica = insertHash(TabelaHash, token, pos);
if(verifica != 1){
printf("Ocorreu um Erro!\n");
exit(1);
}
token = strtok(NULL, " ");
}
pos++;
}
freeHash(TabelaHash);
return 0;
}
Funktion, die die Hash-Tabelle erstellt:
int** criaHash(){
int **ha, i;
ha = (int**) malloc(TABLE_SIZE * sizeof(int*));
if(ha != NULL){
for(i = 0; i < TABLE_SIZE; i++){
ha[i] = (int*) malloc(sizeof(int));
ha[i][0] = 0; // The position ha[i][0] is a counter which indicates how many indexes are going to be realocated in the memory
}
return ha;
}
}
Funktion, die in die Hash-Tabelle einfügt:
int insertHash(int **ha, char *word, int index){
if(ha == NULL)
return 0;
int key = stringValue(word); // stringValue is the hash function, returns an integer which is the index of the hash table
int cont = 1;
int *temp = (int*) realloc(ha[key], sizeof(int));
if(temp == NULL)
return 0;
else
ha[key] = temp;
ha[key][0]++; // ha[i][0] counts the size of the line "i" in the hash table
cont = ha[key][0];
ha[key][cont] = indice; // Inserts the indice of the matrix into the hash table
return 1;
}
Sorry für mein Englisch Denken und Ich hoffe ihr könnt mir helfen. Danke allen!
Es gibt einige verdächtige Dinge in Ihrem Code, aber nicht genug Code, um den Fehler sicher zu identifizieren. Erwäge das Posten eines [mcve]. –
Wenn Sie die Datei lesen, verwenden Sie 'fgets()', um Eingaben in den Puffer 'str' zu lesen, aber in der folgenden Schleife ignorieren Sie die Daten, die Sie gerade gelesen haben, und tokenisieren stattdessen etwas anderes. –
Die 'realloc()' in 'insertHash()' reserviert immer die gleiche Menge an Speicher: genau genug, um einen int zu halten. Das ist wahrscheinlich nicht das, was Sie vorhatten, vor allem, weil Sie später zu 'ha [key] [cont]' schreiben, was ein out-of-bounds-Schreiben sein wird, wenn 'cont' nicht Null ist. –