2013-01-19 31 views
-1

另外,的Facing an error — glibc detected free invalid next size (fast)重复。无效的realloc接下来大小

我一直在努力,我试着用valgrind来追踪它,但似乎无法确定错误的确切来源。我可以调用该函数4次,但之后它会抛出realloc无效的下一个大小错误。

确切的错误:* glibc的检测* ./matrix:realloc的():无效的下一个大小:0x0000000001a46010 ***

下面的代码:

char line[101]; 
int nMatrix = -1; 
Dims *dimensions; 
List *vals = NULL; 
int **values; 
int **columns; 
int **rowPointer; 
int *lineCount; 
int *highestRow; 

void newMatrix() 
{ 
    nMatrix++; 
    values = realloc(values, sizeof(int*)); 
    columns = realloc(columns, sizeof(int*)); 
    rowPointer = realloc(rowPointer, sizeof(int*)); 
    dimensions = realloc(dimensions, sizeof(Dims)); 
    lineCount = realloc(lineCount, sizeof(int)); 
    highestRow = realloc(highestRow, sizeof(int)); 
} 

void readIn(char* inputFile, int transpose) 
{ 
    FILE *fr; 
    int a = 0; 
    int b = 0; 
    int c = 0; 
    newMatrix(); 
    if((fr = fopen(inputFile, "r")) != NULL) 
    { 
     while(fgets(line, 100, fr) != NULL) 
     { 
      if(lineCount[nMatrix] == 0) 
      { 
       if(transpose) 
        sscanf(line, "%d,%d", &dimensions[nMatrix].n, &dimensions[nMatrix].m); 
       else 
        sscanf(line, "%d,%d", &dimensions[nMatrix].m, &dimensions[nMatrix].n); 
       printf("nMatrix = %d, n%d,m%d\n", nMatrix, dimensions[nMatrix].n, dimensions[nMatrix].m); 
      } 
      else 
      { 
       sscanf(line, "%d,%d,%d", &a,&b,&c); 
       //printf("a = %d, b = %d, c = %d\n", a,b,c); 
       //rows[a] = insertList(c,b,rows[a]);c 
       if(transpose) 
        vals = insertList(c, a, b, dimensions[nMatrix].m, dimensions[nMatrix].n, vals); 
       else 
        vals = insertList(c, b, a, dimensions[nMatrix].m, dimensions[nMatrix].n, vals); 
      } 
      lineCount[nMatrix]++; 
     } 
     values[nMatrix] = calloc(lineCount[nMatrix], sizeof(int)); 
     columns[nMatrix] = calloc(lineCount[nMatrix], sizeof(int)); 
     rowPointer[nMatrix] = calloc(((dimensions[nMatrix].m)+1), sizeof(int)); 
     values[nMatrix][lineCount[nMatrix]] = 0; 
     columns[nMatrix][lineCount[nMatrix]] = 0; 
     int i = 0; 
     int lastRow = -1; 
     while(i < dimensions[nMatrix].m) 
     { 
      rowPointer[nMatrix][i] = -1; 
      i++; 
     } 
     i = 0; 
     List *temp = NULL; 
     while(vals != NULL) 
     { 
      temp = vals; 
      //printf("pos = %d, row = %d, col = %d, val = %d, i=%d", temp->position, temp->row, temp->column, temp->value, i); 
      if(lastRow != temp->row) 
      { 
       rowPointer[nMatrix][temp->row] = i; 
       lastRow = temp->row; 
       highestRow[nMatrix] = i; 
      } 
      values[nMatrix][i] = temp->value; 
      columns[nMatrix][i] = temp->column; 
      i++; 
      vals = temp->next; 
      free(temp); 

     } 
     rowPointer[nMatrix][dimensions[nMatrix].m] = lineCount[nMatrix]-1; 
     fclose(fr); 
     return; 
    } 
    fclose(fr); 
    printf("File not found\n"); 
    return; 
} 
+0

请加入确切的错误信息到您的文章。 –

+0

哪个函数给你错误? – krammer

+0

看书,我可以把它的4倍,但比这更导致malloc的错误 – ethangk

回答

1

随着每一个新矩阵你“分配”,你应该是扩展你的全局指针列表。你没有。只要把它们重新分配到了之前的大小相同:

此:

void newMatrix() 
{ 
    nMatrix++; 
    values = realloc(values, sizeof(int*)); 
    columns = realloc(columns, sizeof(int*)); 
    rowPointer = realloc(rowPointer, sizeof(int*)); 
    dimensions = realloc(dimensions, sizeof(Dims)); 
    lineCount = realloc(lineCount, sizeof(int)); 
    highestRow = realloc(highestRow, sizeof(int)); 
} 

应该是这样的:

void newMatrix() 
{ 
    nMatrix++; 
    values = realloc(values, (nMatrix+1)*sizeof(int*)); 
    columns = realloc(columns, (nMatrix+1)*sizeof(int*)); 
    rowPointer = realloc(rowPointer, (nMatrix+1)*sizeof(int*)); 
    dimensions = realloc(dimensions, (nMatrix+1)*sizeof(Dims)); 
    lineCount = realloc(lineCount, (nMatrix+1)*sizeof(int)); 
    highestRow = realloc(highestRow, (nMatrix+1)*sizeof(int)); 
} 

注:(nMatrix+1)值的使用,因为你开始nMatrix(-1) ,并在第一个增量是(0),接下来就是(1),等...即它总是索引插入的最后一行,但你的矢量幅度需要为+1,以达到希望显而易见的原因。

我强烈建议你考虑一下,当realloc()也将失败,因为它会返回NULL,并在这个过程中泄漏任何内存通过你传递的指针指向发生。

可能有其他问题,但那是第一个向我跳出来的问题。

+0

我才意识到这一点,并测试了它,但问题是,它现在段错误,运行GDB产量: 计划接收信号SIGSEGV,分割过错。_int_free(av = 0x7ffff7ad7740 ,p = 0x605360,have_lock = 0)在malloc.c:4054 malloc.c:没有这样的文件或目录。 – ethangk

+0

@ethangk一旦你应用上述,​​重新运行这个valgrind下。在你的主代码循环的某个地方,你可能会在内存上跺脚,但至少你*现在有*内存可以跺脚。此外,在这个代码中没有任何地方是一个'free()'调用,除了* *之外,你应该仔细看看。它释放了在这里甚至没有分配的内存(它在'insertList()'中分配)。实际的曝光是你清理的任何地方。无论哪种方式,在这个答案中指出的代码是*错误*,应该按照描述来解决。 – WhozCraig

+0

我在valgrind下重新执行它,奇怪的是它一直运行代码。 readIn函数底部有一个free()调用。在我测试的代码中,我已经将3个calloc调用改为malloc,我将它们改回原来的代码。非常感谢,我会解决你提出的问题。 – ethangk

相关问题