"Двойное освобождение или повреждение (выход)" при закрытии файла? - PullRequest
0 голосов
/ 17 января 2019

Я написал код для работы с различными аргументами (файлами, динамическими двумерными массивами, передачей указателей на функции и т. Д.), Поэтому не возражайте, если некоторые отрывки кажутся бесполезными. Во время выполнения, если я ввожу более 3 строк, происходит сбой программы, и терминал сообщает «Двойное освобождение или повреждение (выход)», а затем создается дамп ядра. Ошибка должна произойти на fclose (fp) в foo2.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void foo1(int *);
void foo2(int*,int,int**,FILE*);
void readfoo(FILE *, int **, int);

int main(void)
{
    FILE *fp;
    int **a, i, j, r, c, *pr, *pn, *pc;
    pc = &c;
    pr = &r;
    foo1(pr);
    a = malloc(r*sizeof(int));
    foo2(pc,r,a,fp);
    if((fp = fopen("column.txt", "r")) == NULL)
    {
        fprintf(stderr, "Error, can't open \"column.txt\"");
        exit(1);
    }
    for(i=0;i<r;i++)
    {
        fscanf(fp,"%d", &c);
        for(j=0; j<c; j++)
        {
            fprintf(stdout, "insert line %d column %d -> ", i+1, j+1);
            fscanf(stdin, "%d", &a[i][j]);
        }
    }
    if(fclose(fp) != 0)
    {
        fprintf(stderr, "Error, can't close \"column.txt\"");
        exit(1);
    }
    readfoo(fp,a,r);
    remove("column.txt");
    return(0);
}

void foo1(int *r)
{
    fprintf(stdout, "how many lines ? -> ");
    fscanf(stdin, "%d", r);
}

void foo2(int *c, int r, int **a, FILE *fp)
{
    int i,j, act_c;
    if((fp = fopen("column.txt", "w")) == NULL)
    {
        fprintf(stderr, "Error, can't open \"column.txt\"");
        exit(1);
    }
        for(i=0;i<r;i++)
    {
        fprintf(stdout, "how many columns for line %d? -> ", i+1);
        fscanf(stdin, "%d", c);
        fprintf(fp,"%d\n", *c);
        a[i] = malloc((*c)*sizeof(int));
    }
    if(fclose(fp) != 0)
    {
        fprintf(stderr, "Error, can't close \"column.txt\"");
        exit(1);
    }
}

void readfoo(FILE *fp, int **a, int r)
{
    int c, i, j;
    fprintf(stdout, "printing the matrix... \n");
    if((fp = fopen("column.txt", "r")) == NULL)
    {
        fprintf(stderr, "Error, can't open \"column.txt\"");
        exit(1);
    }
    for(i=0;i<r;i++)
    {
        fscanf(fp,"%d", &c);
        for(j=0; j<c; j++)
        {
            fprintf(stdout, "%d ", a[i][j]);
        }
        fprintf(stdout, "\n");
    }
    if(fclose(fp) != 0)
    {
        fprintf(stderr, "Error, can't close \"column.txt\"");
        exit(1);
    }
}

1 Ответ

0 голосов
/ 17 января 2019

в main() вы делаете

 a = malloc(r*sizeof(int));

Это неправильно, это должно быть

 a = malloc(r*sizeof(int *));

Это вызывает UB, если вы присваиваете значения a[i], и может быть реальной причиной сбоя

...