-1

または、Facing a error — glibcが空きの無効な次のサイズ(高速)を検出しました。

私はこれに苦労してきました。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;
}
4

1 に答える 1

2

「割り当てる」新しいマトリックスごとに、グローバルポインタリストを拡張する必要があります。あなたはそうしない。以前と同じサイズに再割り当てするだけです。

これ:

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)値はnMatrixas(-1)で始まり、最初の増分で(0)、次は(1)、などであるために使用されます。つまり、挿入された最後の行に常にインデックスを付けますが、ベクトルの大きさは、うまくいけば明らかなように、それに+1する必要があります。理由。

失敗した場合にも何が起こるかを検討することを強くお勧めします。これは、NULLを返し、プロセスで、渡したポインタが指しているメモリrealloc()リークするためです。

他の問題があるかもしれませんが、それが私に飛び出した最初の問題でした。

于 2013-01-19T15:12:52.777 に答える