Я не нашел решение проблемы ниже. Я искал это слишком много раз, но я до сих пор не знаю, как это решить.Ошибка 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;
}
Извините за мой английский мысли и Я надеюсь, что вы можете мне помочь. Спасибо всем!
В коде есть несколько подозрительных вещей, но недостаточно кода, чтобы уверенно идентифицировать ошибку. Рассмотрите возможность размещения [mcve]. –
Когда вы читаете файл, вы используете 'fgets()' для чтения ввода в буфер 'str', но в следующем цикле вы игнорируете данные, которые вы только что прочитали, и вместо этого добавляете токены. –
'realloc()' in 'insertHash()' всегда выделяет один и тот же объем памяти: достаточно, чтобы удерживать один int. Вероятно, это не то, что вы хотели сделать, особенно после того, как позже вы напишете на 'ha [key] [cont]', который будет выходить за пределы, если 'cont' отличен от нуля. –