我找不到下面问题的解决方案。我已经搜索了太多次,但我仍然不知道如何解决。
我需要做什么: 我必须制作一个程序,用随机推文读取存档并将其保存在矩阵中。之后,应该允许用户编写单词列表。该程序必须阅读每个单词并向用户显示那些包含该单词的推文。
我的解决方案: 程序在矩阵中读取存档后,推文中的每个单词都会进入散列函数。散列函数告诉矩阵中推文的索引应该转到哈希表的位置。哈希表的工作方式类似于整数矩阵。哈希表的每个索引都有一个指向数组的指针,该数组具有推文所在矩阵的索引。
问题: realloc功能不能很好地工作。在一些插入之后,该函数停止程序并显示错误: *错误在./a.out':realloc():下一个大小无效:0x00000000023f2460 *
我认为这是因为该函数试图访问哈希表的无效位置,但我不确定。
档案中的推文看起来像这样:" 14,0,jb不再在澳大利亚展示!"。每行包含3个以逗号分隔的信息。
我的" int main()" - >读取存档并调用将矩阵索引插入哈希表的函数:
#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;
}
对不起我的英语思想,我希望你能帮助我。 谢谢大家!
答案 0 :(得分:0)
对此:
问题:realloc功能效果不佳。在一些插入之后,该函数停止程序并显示错误:* ./a.out'中的错误:realloc():下一个大小无效:0x00000000023f2460 *
对任何内存分配函数(malloc,calloc,realloc)的调用总是在堆中查找足够大的内存块,其中包含所请求的字节数。为此,它会查看这些已分配内存块之间的链接。当其中一个链接不正确(NULL或超出堆的边界等)时,它将返回错误。
代码产生错误,因为每次写入哈希表(0索引除外)都会覆盖这些链接
答案 1 :(得分:0)
在询问有关运行时问题的问题时:
发布的代码不完整,编辑不干净。
注意:当发布的代码甚至无法编译时,我们不太可能帮助您解决运行时问题。
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()'
编译时,始终启用所有警告,然后修复这些警告
适当的原型语句会修复其中的一些警告,但不会修复所有这些警告,并且不会修复任何错误。
for gcc
,编译使用:
gcc -Wall -Wextra -pedantic -Wconversion -std=gnu99 -c -ggdb fileName.c -o fileName.o
gcc
,链接使用:
gcc -ggdb fileName.o -o fileName
注意:对于(希望)与问题无关的函数,只需发布原型语句
请解决问题,然后发布带有更正的其他文字
答案 2 :(得分:0)
很抱歉没有发布整个代码和问题。我不知道如何问这个问题。那么,代码现在正在运行......
用户3629249解释了该问题。我使用具有已定义大小的malloc将其修复为哈希表中的所有指针。
谢谢大家!