2016-06-19 2 views
0

Я не нашел решение проблемы ниже. Я искал это слишком много раз, но я до сих пор не знаю, как это решить.Ошибка Realloc: realloc(): недопустимый следующий размер

Что я должен сделать: я должен сделать программу, которая читает архив со случайными твиты и сохраняет его в матрице. После этого пользователю должно быть разрешено записывать список слов. Программа должна читать каждое слово и показывать пользователю те твиты, в которых есть слово.

Мое решение: После того как программа читает архив в матрице, каждое слово в твитов идет к функции хеширования. Функция хэширования указывает, где индекс твита в матрице должен перейти в хеш-таблицу. Хэш-таблица работает как матрица целых чисел. Каждый индекс хэш-таблицы имеет указатель на массив с индексами матрицы, в которой находятся твиты.

Проблема: Функция realloc работает не очень хорошо. После некоторых вставок, функция останавливает программу и показывает ошибку: * Ошибка в `./a.out ': перераспределить(): Invalid следующего размера: 0x00000000023f2460 *

Я думаю, это потому, что функция пытается получает недействительную позицию хэш-таблицы, но я точно не знаю.

Твиты в архиве выглядят так: «14,0, jb isnt показывается в Австралии уже!». Каждая строка содержит 3 информации, разделенных запятой.

Мои «ИНТ основной()» -> читает архив и вызывает функцию, которая вставляет индекс матрицы в хэш-таблице:

#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; 
} 

Функция, которая создает хэш-таблицу:

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; 
} 
} 

Функция, которая вставляет в хэш-таблице:

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; 
} 

Извините за мой английский мысли и Я надеюсь, что вы можете мне помочь. Спасибо всем!

+1

В коде есть несколько подозрительных вещей, но недостаточно кода, чтобы уверенно идентифицировать ошибку. Рассмотрите возможность размещения [mcve]. –

+2

Когда вы читаете файл, вы используете 'fgets()' для чтения ввода в буфер 'str', но в следующем цикле вы игнорируете данные, которые вы только что прочитали, и вместо этого добавляете токены. –

+2

'realloc()' in 'insertHash()' всегда выделяет один и тот же объем памяти: достаточно, чтобы удерживать один int. Вероятно, это не то, что вы хотели сделать, особенно после того, как позже вы напишете на 'ha [key] [cont]', который будет выходить за пределы, если 'cont' отличен от нуля. –

ответ

0

относительно этого:

Проблема: Функция перераспределить не работает очень хорошо. После некоторых вставок функция останавливает программу и показывает ошибку: * Ошибка в `./a.out ': realloc(): недопустимый следующий размер: 0x00000000023f2460 *

Вызов любой из функций выделения памяти (malloc , calloc, realloc) всегда ищет блок памяти в куче, который достаточно большой, содержит количество запрошенных байтов. Для этого он просматривает связи между выделенными блоками памяти. Когда одна из этих ссылок неверна (NULL или вне границ кучи и т. Д.), Она возвращает ошибку.

Код вызывает ошибку, потому что каждая запись в хэш-таблице (кроме индексом 0) будет перезаписывать эти ссылки

+0

Что вы делали, что «все еще не работает»? Я ответил на вопрос о том, почему произошла ошибка. Я не сказал, как исправить проблему (проблемы) в опубликованном коде. – user3629249

0

Задавая вопрос о проблеме выполнения:

  1. почтового кода, чисто компилирует
  2. почтового кода, короткие, но все-таки столкнулись с проблемой

Опубликованный код не является полным и не чисто компилировать ,

Примечание: мы вряд ли сможем помочь вам с проблемой выполнения, когда опубликованный код даже не компилируется.

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()' 

При компиляции всегда включайте все предупреждения, а затем исправить эти предупреждения

Соответствующие заявления прототипа бы исправить некоторые из этих предупреждений, но не все из них и не исправить какие-то ошибки.

для gcc, компилировать использование:

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

для gcc, чтобы связать использование:

gcc -ggdb fileName.o -o fileName 

Примечание: для функций, которые (надеюсь) не имеет отношения к этой проблеме, просто выкладываю prototype statement

Исправить проблемы, после чего добавьте дополнительный текст с поправками

0

Извините, что не публикует весь код и проблемы. Я не знал, как задать вопрос. Ну, код работает сейчас ...

Проблема была объяснена пользователем3629249. Я исправил его с помощью malloc с определенным размером для всех указателей в хеш-таблице.

Спасибо всем!

Смежные вопросы