Realloc Error: realloc(): invalid next size

Realloc Error: realloc(): invalid next size

我找不到以下问题的解决方案。找了很多次了,还是不知道怎么解决。

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

我的解决方案: 程序读取矩阵中的档案后,推文中的每个词都会进入哈希函数。散列函数告诉矩阵中推文的索引应该去哪里散列 table。散列 table 就像一个整数矩阵。散列的每个索引 table 都有一个指向数组的指针,该数组包含推文所在的矩阵的索引。

问题: realloc 函数不是很好用。一些插入后,函数停止程序并显示错误:* Error in `./a.out': realloc(): invalid next size: 0x00000000023f2460 *

我认为这是因为该函数试图访问散列的无效位置 table,但我不确定。

存档中的推文如下所示:“14,0,jb 不再出现在澳大利亚!”。每行包含 3 个信息,以逗号分隔。

My "int main()" -> 读取存档并调用将矩阵索引插入散列的函数 table:

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

创建哈希的函数table:

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

插入哈希的函数table:

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

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

对此:

问题:realloc 函数运行不正常。一些插入后,函数停止程序并显示错误:* Error in `./a.out': realloc(): invalid next size: 0x00000000023f2460 *

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

代码产生错误是因为每次写入散列 table(0 索引除外)都会覆盖这些链接

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

  1. post 干净编译的代码
  2. post 代码很短,但仍然存在问题

post编辑的代码不完整,编译不干净。

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

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,到 link 使用:

gcc -ggdb fileName.o -o fileName

注意:对于(希望)与问题无关的函数,只需post原型语句

请解决问题,然后,post 附加更正文本

很抱歉没有发布完整的代码和问题。我不知道该怎么问这个问题。好了,代码现在可以运行了...

问题由用户3629249解释。我使用具有已定义大小的 malloc 将其修复到散列 table.

中的所有指针

谢谢大家!