Передача двухмерного динамического массива в функцию - C (СИ)

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

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

Честно говоря пересмотрел многие форумы и темы но так и не понял как это сделать. Как передать двухмерный (обычный) массив мне понятно но что делать с динамическим представление не имею. Вот собственно код на С:
#include<stdio.h>
#include<stdlib.h>
 
typedef int T;
 
void Release(T **a,size_t m)
{
size_t Row;
    for (Row=0;Row<m;Row++)
    {
       if(a[Row]!=NULL)
        {
            free(a[Row]);
        }
    }
 free;
}
 
T **Allocate(size_t m, size_t n)
{
T **a;
size_t Row;
int Success=1;
a=malloc(m*sizeof*a);
    if (a!=NULL)
    {
       for(Row=0;Row<m;Row++)
        {
          a[Row]=malloc(n*sizeof *a[Row]);
             if(NULL==a[Row])
             {
               Success=0;
             }
         }
         if(1!=Success)
         {
         Release(a,m);
         a=NULL;
         }
    }
return a;
}
 
main()
{
T **array;
int i,j;
int total=0;
int row=4;
int col=7;
 
array=Allocate(row,col);
    if(array!=NULL)
    {    
      for(i=0;i<row;i++) //Массив заполняется
          for(j=0;j<col;j++)
           array[i][j]=i+j;
 
        for(i=0;i<row;i++) //Массив выводится на печать
                          {
            for(j=0;j<col;j++)
              {
               printf("%d",array[i][j]);
               }
            printf("\n");
        }
 
    }
Release(array,row);
}
Каким образом передать массив в функцию чтобы заполнение и печать осуществлялись в ней?

Решение задачи: «Передача двухмерного динамического массива в функцию»

textual
Листинг программы
int ** arr = (int **)malloc(m*sizeof(int *));
[0]
[]
[]
[]
[]
[]
[]
[m - 1]
 
arr[i] = (int *)malloc(n*sizeof(int)) : [][][][][][][n - 1]
 
arr
[][][]
[][][]
[][][]
 
Чистка от начала
free((void *) arr[0])
х - и сразу связь со строками разрушили
[][][]
[][][]
х - мусор
arr[0][0] - уже ни на что не указывает!
Как по думается при переполнении ОЗУ(например запусттили игру которая сожрала всё оперативу) возможен сбой
бабах
arr
x
yz[][][]
kl[][][] - снесло блоки (например они очутились в файле подкачки) (потому как связи нет с **arr их уже не достать, тупо баласт)
Предположем держали в памяти изображение мб на 10, что ж за 10 сбоев 100Мб памяти уйдут в никуда
 
Чистка от конца
arr
[][][]
[][][]
[][][]
free((void *) arr[m - 1])
[][][]
[][][]
х
arr - связь строк сохранилась
arr[0][0] - указатель не обнулён!
бабах - всё ок - строки связаны
arr
[][][]
[][][]
х - и
 
Почистили до 1-й строки
arr
[][][]
x
x
free((void *)arr[0]);
сразу удаляем arr[0] и указатель *arr тоже

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

В данном коде описывается процесс работы с двумерным динамическим массивом в языке программирования C.

  1. Сначала мы выделяем память под массив указателей на int с помощью функции malloc. Мы получаем указатель на первый элемент массива и сохраняем его в переменной arr.
  2. Затем мы проходим по всем элементам массива и для каждого из них выделяем память под массив int с помощью функции malloc. Мы сохраняем указатель на первый элемент этого массива в соответствующем элементе массива arr.
  3. После этого мы очищаем память, начиная с первого элемента массива, с помощью функции free. При этом мы также освобождаем память, выделенную под сам массив arr.
  4. Затем мы снова очищаем память, начиная с последнего элемента массива, с помощью функции free. В этот раз мы освобождаем память, выделенную под последний элемент массива arr, но не трогаем сам массив.
  5. Наконец, мы очищаем память, начиная с первого элемента массива, с помощью функции free. В этот раз мы освобождаем память, выделенную под первый элемент массива arr, но не трогаем сам массив.

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


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

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

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