Как считать двумерный массив в Си?

Рейтинг: 0Ответов: 3Опубликовано: 23.02.2011

Выделяю память для массива. Считываю данные из файла, и у меня либо вылетает, либо нули или непонятные цифры появляются. Запуталась с освобождением памяти... (

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

double **A;
int n_A, m_A;
int i, j;

void read_matrix(const char *filename)
{
    FILE *file = fopen(filename, "r");

    /* m_A - число строк, n_A - число столбцов */
    fscanf(file, "%d %d", &m_A, &n_A);
    A = (double **)malloc(n_A * sizeof(double *));

    if (A != NULL) {
        for (i = 0; i < m_A; i++) {
            A[i] = (double *)malloc(n_A * sizeof(double));
            if (A[i] != NULL) {
                memset(A[i], 0, n_A * sizeof(double));
                free(A[i]);
            }
            fscanf(file, "%lf", &A[i][j]);
        }
    }
}

int main(int argc, char *argv[])
{
    clrscr();
    read_matrix("data 2.dat");
    free(A);
    getch();

    return 0;
}

Ответы

▲ 2Принят
  1. Должно быть: A = (double ** ) malloc( m_A * sizeof(double * ));
  2. Освобождение памяти free(A[i]); делаете слишком рано, очевидно, что в этой функции вообще не надо освобождать.
  3. Для fscanf(file, "%lf", &A[i][j]); должен быть цикл по j, чтобы прочитать все значения
▲ 2

Вы делаете free(A[i]), а затем пытаетесь что-то записать в A[i][j], ошибка. Кстати, цикла по j вообще нет. Но я бы посоветовал вам вообще отказаться в этой задаче от динамических выделений памяти, а использовать память на стеке:

double A[m_A][n_A];

и затем так же, но без malloc и free. Но это если ваша цель — не научиться выделять память :)

▲ 2
//Функция readfromfile (FILE * fp, double ** p, int sz1, int sz2)
//Входящее значение:    FILE * fp  - файл 
//                      double ** p - двумерный массив
//                      int sz1 - строки
//                      int sz2 - столбцы
//Функция построчно считывает файл в массив
void readfromfile (FILE * fp, double ** p, int sz1, int sz2)
{
    int i,j;
    for(i=0;i<sz1;i++)
        for(j=0;j<sz2;j++)      //Естесвенным образом считываем данные из файла
            fscanf(fp,"%Lf",&p[i][j]);  //в двумерный массив.
}

//Функция create(int sz1, int sz2)
//Входящее значение:    
//                      int sz1 - строки
//                      int sz2 - столбцы
//Функция создает двумерный массив SZ1 x SZ2
//Исходящее значение:   double **   - двумерный массив SZ1 x SZ2
double ** create(int sz1, int sz2)
{
    double ** temp = (double **) malloc(sz1 * sizeof(double *));    //Здесь и далее - некомментируемые 
    for (int i=0; i<sz1; i++)                                      //действия считаются очевидными - и не
        temp[i] = (double *) malloc(sz2 * sizeof(double));        //нуждаются в комментировании.
    return temp;   
}

//Функция erase(double ** p, int sz1)
//Входящее значение:    
//                      double ** p - двумерный массив
//                      int sz1 - строки
//Функция очищает память от двумерного массива
void erase(double ** p, int sz1)
{
    for (int i=0; i<sz1; i++)
        free(p[i]);
    free(p);
}