Передача двухмерного динамического массива в функцию - 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.
- Сначала мы выделяем память под массив указателей на int с помощью функции malloc. Мы получаем указатель на первый элемент массива и сохраняем его в переменной arr.
- Затем мы проходим по всем элементам массива и для каждого из них выделяем память под массив int с помощью функции malloc. Мы сохраняем указатель на первый элемент этого массива в соответствующем элементе массива arr.
- После этого мы очищаем память, начиная с первого элемента массива, с помощью функции free. При этом мы также освобождаем память, выделенную под сам массив arr.
- Затем мы снова очищаем память, начиная с последнего элемента массива, с помощью функции free. В этот раз мы освобождаем память, выделенную под последний элемент массива arr, но не трогаем сам массив.
- Наконец, мы очищаем память, начиная с первого элемента массива, с помощью функции free. В этот раз мы освобождаем память, выделенную под первый элемент массива arr, но не трогаем сам массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д