2016-06-19 17 views
0

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!

+1

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]. –

+2

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. –

+2

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. –

Antwort

0

bezüglich dieser:

Das Problem: Die realloc Funktion ist nicht sehr gut funktioniert. Nach einigen Einfügungen stoppt die Funktion das Programm und zeigt einen Fehler an: * Fehler in `./a.out ': realloc(): ungültig nächste Größe: 0x00000000023f2460 *

Ein Aufruf einer der Speicherzuordnungsfunktionen (malloc , calloc, realloc) sucht immer nach einem Speicherblock im Heap, der groß genug ist, um die Anzahl der angeforderten Bytes zu enthalten. Um dies zu tun, untersucht es die Verbindungen zwischen diesen zugewiesenen Speicherblöcken. Wenn eine dieser Verknüpfungen nicht korrekt ist (NULL oder außerhalb der Grenzen des Heapspeichers usw.), wird der Fehler zurückgegeben.

Der Code erzeugt den Fehler, da jeder auf der Hash-Tabelle (außer einem 0-Index) schreiben wird diese Links

+0

was hast du gemacht das 'immer noch nicht funktioniert'? Ich habe die Frage beantwortet, warum der Fehler aufgetreten ist. Ich habe nicht gesagt, wie man das Problem im gebuchten Code behebt. – user3629249

0

überschreiben Wenn Sie eine Frage zu einem Laufzeit Problem stellen:

  1. Postleitzahl, dass sauber kompiliert
  2. Postleitzahl, die kurz ist, zeigt aber immer noch das Problem

Der entsandte Code nicht vollständig ist und nicht kompiliert sauber .

Hinweis: Es ist unwahrscheinlich, dass wir Ihnen bei einem Laufzeitproblem helfen können, wenn der veröffentlichte Code nicht einmal kompiliert wird.

implicit declaration of function 'criahash()' 

assignment makes pointer from integer without a cast 
Tabelahash = criaHash(); 

implicit declaration of function: 'removeEspacoslniciais()' 

implicit declaration of function: 'InsertHash()' 

implicit declaration of function: 'freeHash()' 

conflicting types for 'criaHash()' 

implicit declaration of function 'stringValue()' 

'indice' undeclared 

unused parameter 'index' 

control reaches end of non-void function: 'criahash()' 

Beim Kompilieren, immer alle Warnungen aktivieren, diese Warnungen beheben

Entsprechende Prototypen Aussagen einige dieser Warnungen würde beheben, aber nicht alle von ihnen und würde keine der Fehler beheben.

für gcc, verwenden zu kompilieren:

gcc -Wall -Wextra -pedantic -Wconversion -std=gnu99 -c -ggdb fileName.c -o fileName.o 

für gcc, auf Link:

gcc -ggdb fileName.o -o fileName 

Hinweis: für Funktionen, die (hoffentlich) nicht relevant für das Problem, nur schreiben die Prototyp-Anweisung

Bitte beheben Sie die Probleme, dann senden Sie zusätzlichen Text mit den Korrekturen

0

Entschuldigung, dass wir nicht den gesamten Code und die Probleme gepostet haben. Ich wusste nicht, wie ich die Frage stellen sollte. Nun, der Code funktioniert jetzt ...

Das Problem wurde vom Benutzer3629249 erklärt. Ich habe es mit einem Malloc mit einer definierten Größe für alle Zeiger in der Hash-Tabelle behoben.

Danke allen!