【问题标题】:*** Error in `./threads': corrupted double-linked list: 0x00000000009bb240 *** in fclose*** `./threads' 中的错误:损坏的双链表:0x00000000009bb240 *** 在 fclose 中
【发布时间】:2013-05-02 23:17:30
【问题描述】:

我需要编写一个程序,首先从文本文件中读取一个矩阵并将其放入内存中。我能够这样做,但是当我尝试使用 4 行或更多行的矩阵关闭文件时,它会给出错误: * `./threads' 中的错误:损坏的双链表:0x0000000001b4e240 * 读取文件的代码是:

    void leitura_matriz1 ()
{
    char linha_s[MAX_LINHA];
    char *buffer;

    // leitura da primeira matriz
    FILE * matriz1_file;
    matriz1_file = fopen ("in1.txt","r");
    if (matriz1_file == NULL)
    {
        printf ("Erro na abertura do arquivo\n");
        exit(1);
    }

    // número de linhas
    fgets(linha_s, MAX_LINHA, matriz1_file);
    buffer = strtok(linha_s, " =");
    buffer = strtok(NULL, " =");
    linhas_mat1 = atoi(buffer);

    // número de colunas
    fgets(linha_s, MAX_LINHA, matriz1_file);
    buffer = strtok(linha_s, " =");
    buffer = strtok(NULL, " =");
    colunas_mat1 = atoi(buffer);

    // aloca espaço para a matriz
    matriz1 = (int**) malloc(linhas_mat1 * sizeof(int));
    if (matriz1 == NULL)
    {
        printf("erro memória");
        exit(1);
    }
    int lin, col;
    for (lin = 0; lin < linhas_mat1; lin++)
    {
        matriz1[lin] = (int*) malloc(colunas_mat1 * sizeof(int));
        if (matriz1[lin] == NULL)
        {
            printf ("erro memória 2");
            exit(1);
        }
    }

    // lê os valores do arquivo e coloca na matriz em memória
    for (lin = 0; lin < linhas_mat1; lin++)
    {
        fgets(linha_s, MAX_LINHA, matriz1_file);
        buffer = strtok(linha_s, " ");
        for (col = 0; col < colunas_mat1; col++)
        {
            matriz1[lin][col] = atoi(buffer);
            buffer = strtok(NULL, " ");
        }
    }

    fclose (matriz1_file);  
}

文件格式是这样的:

LINHAS = 4
COLUNAS = 3
5 5 5
5 5 5
5 5 5
5 5 5

LINHAS 是行和 COLUNAS 列 当文件仍然打开时,我在关闭文件时从未遇到错误。并且仅当文件超过 3 行(4 行或更多行)时才会发生。有人知道它可能是什么吗?

【问题讨论】:

    标签: c fclose


    【解决方案1】:

    第一次分配不正确。而不是:

    matriz1 = (int**) malloc(linhas_mat1 * sizeof(int));
    

    应该是:

    matriz1 = (int**) malloc(linhas_mat1 * sizeof(int*));
    

    异常消息(8 个字节)似乎表明一个 64 位应用程序,因此指针将是 8 个字节,而 sizeof(int) 可能只有 4 个字节。这将导致在填充数组时覆盖内存。

    【讨论】:

    • 非常感谢。这似乎是问题所在。这是我第一次在 64 位操作系统中编写 C 程序,所以这种方法以前一直有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多