Динамическое выделение памяти под двумерный массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, есть программа которая создаёт двумерный массив, вопрос такой как можно поправить программу чтоб она выделяла память динамически про malloc, calloc слышал но не пойму как их применить на практике, ибо длля меня это тёмный лес)). Может кто нибудь подсказать?
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <io.h>
 
int main(int argc, char *argv[])
{
char a[5][5]; //выделяю память для массива размером 25 байт
int i,j,n, handle; //объявляю переменные типа integer
for(i=0;i<5;i++)
 {
    for(j=0;j<5;j++)
    {
          
          n=5;  //создаю временную переменную
          a[i][j]=0; //присваиваю всем элементам массива 0 значение
          if((i==j)||(j==n-i-1)) a[i][j]=1; 
          printf("%3d", a[i][j]); //вывожу на экран сформированную матрицу  
          }                       //размером 5х5
          printf("\n");
          }
          _fmode=O_BINARY;
          handle=creat("matrix.txt", S_IREAD|S_IWRITE); //создаю двоичный файл
          write(handle, a, sizeof(a)); //записываю матрицу в файл
          close(handle); //закрываю файл
          getch();  //ждём нажатия любой клавиши
}

Решение задачи: «Динамическое выделение памяти под двумерный массив»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <io.h>
 
int main(int argc, char *argv[])
{
    int N = 5;
    int M = 5;
    int i,j,n, handle; //объявляю переменные типа integer
    char *a_storage;
    char **a;
 
    a_storage = (char*)malloc(N*M); //выделяем память для массива размером N*M байт
    a = (char**)malloc(N*sizeof(char*)); //массив указателей на строки матрицы
    for (i = 0; i < N; ++i)
        a[i] = a_storage + i*M; //инициализируем строки
 
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
 
            n=5;  //создаю временную переменную
            a[i][j]=0; //присваиваю всем элементам массива 0 значение
            if((i==j)||(j==n-i-1)) a[i][j]=1; 
            printf("%3d", a[i][j]); //вывожу на экран сформированную матрицу  
        }                       //размером NхM
        printf("\n");
    }
    _fmode=O_BINARY;
    handle=creat("matrix.txt", S_IREAD|S_IWRITE); //создаю двоичный файл
    write(handle, a, N*M); //записываю матрицу в файл
    close(handle); //закрываю файл
 
    free(a); //освобождаем память
    free(a_storage); //освобождаем память
 
    getch();  //ждём нажатия любой клавиши
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с памятью и файлами
  2. Объявление переменных типа integer для размера матрицы и для работы с циклом
  3. Выделение динамической памяти под массив строк с помощью malloc
  4. Инициализация каждой строки матрицы указателем на соответствующий блок памяти
  5. Инициализация всех элементов матрицы значением 0
  6. Установка значения 1 для элементов матрицы, удовлетворяющих определенному условию
  7. Вывод на экран сформированной матрицы
  8. Создание двоичного файла для записи матрицы
  9. Запись матрицы в созданный файл
  10. Закрытие файла
  11. Освобождение памяти, выделенной под матрицу
  12. Ожидание нажатия любой клавиши для завершения работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы