Realloc错误:realloc():下一个大小

时间:2016-06-19 21:23:03

标签: c hashtable realloc

我找不到下面问题的解决方案。我已经搜索了太多次,但我仍然不知道如何解决。

我需要做什么: 我必须制作一个程序,用随机推文读取存档并将其保存在矩阵中。之后,应该允许用户编写单词列表。该程序必须阅读每个单词并向用户显示那些包含该单词的推文。

我的解决方案: 程序在矩阵中读取存档后,推文中的每个单词都会进入散列函数。散列函数告诉矩阵中推文的索引应该转到哈希表的位置。哈希表的工作方式类似于整数矩阵。哈希表的每个索引都有一个指向数组的指针,该数组具有推文所在矩阵的索引。

问题: 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;
}

对不起我的英语思想,我希望你能帮助我。 谢谢大家!

3 个答案:

答案 0 :(得分:0)

对此:

问题:realloc功能效果不佳。在一些插入之后,该函数停止程序并显示错误:* ./a.out'中的错误:realloc():下一个大小无效:0x00000000023f2460 *

对任何内存分配函数(malloc,calloc,realloc)的调用总是在堆中查找足够大的内存块,其中包含所请求的字节数。为此,它会查看这些已分配内存块之间的链接。当其中一个链接不正确(NULL或超出堆的边界等)时,它将返回错误。

代码产生错误,因为每次写入哈希表(0索引除外)都会覆盖这些链接

答案 1 :(得分:0)

在询问有关运行时问题的问题时:

  1. 完全编译的帖子代码
  2. 发布短代码,但仍然存在问题
  3. 发布的代码不完整,编辑不干净。

    注意:当发布的代码甚至无法编译时,我们不太可能帮助您解决运行时问题。

    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将其修复为哈希表中的所有指针。

谢谢大家!