Инициализация двумерного массива в функции типа void - C (СИ)
Формулировка задачи:
void input(int *n, int *m);
void initializatoin_remember(int ***rememberX, int n);
int main()
{
int n, m;
int **rememberX;
input(&n, &m);
initializatoin_remember(&rememberX, n);
getch();
}
void input(int *n, int *m)
{
printf("\nInput counts raws\n");
scanf("%d", n);
*m = *n + 1;
}
void initializatoin_remember(int ***rememberX, int n)
{
int i, z;
*rememberX = (int**)malloc((n - 1) * sizeof(int*));
for (i = 0; i < n; i++)
*rememberX[i] = (int*)malloc(2 * sizeof(int));//выдаёт ошибку в процессе исполнения программы
//пробовал и так: *(rememberX[i]) = (int*)malloc(2 * sizeof(int)); но не помогло
for (i = 0; i < n - 1; i++)
for (z = 0; z<2; z++)
*rememberX[i][z] = 0;
}Решение задачи: «Инициализация двумерного массива в функции типа void»
textual
Листинг программы
void input(int *n, int *m);
void initializatoin_remember(int **&rememberX, int n);
int main()
{
int n, m;
int **rememberX;
input(&n, &m);
initializatoin_remember(rememberX, n);
getch();
}
void input(int *n, int *m)
{
printf("\nInput counts raws\n");
scanf("%d", n);
*m = *n + 1;
}
void initializatoin_remember(int **&rememberX, int n)
{
int i, z;
rememberX = (int**)malloc(n*sizeof(int));
for (i = 0; i < n; i++)
rememberX[i] = (int*)malloc(2*sizeof(int));
for (i = 0; i < n - 1; i++)
for (z = 0; z<2; z++)
rememberX[i][z] = 0;
}
Объяснение кода листинга программы
- Объявлены функции:
input(int *n, int *m)initializatoin_remember(int **&rememberX, int n)
- В функции
main()объявлены переменные:nmrememberX
- В функции
main()вызваны функции:input(&n, &m)initializatoin_remember(rememberX, n)
- В функции
input(int *n, int *m)происходит запрос на ввод количества строк и сохранение значения в переменнойn. Затем значениеnиспользуется для вычисления количества столбцов, которые равныn + 1, и сохраняются в переменнойm. - В функции
initializatoin_remember(int **&rememberX, int n)происходит выделение памяти под двумерный массив с помощьюmalloc(). Для каждой строки массива выделяется память под два целочисленных значения. Затем значения по умолчанию равные 0 устанавливаются для всех элементов массива, кроме последнего. - В функции
main()не происходит ничего, кроме вызова указанных выше функций и вывода значенияgetch(). - Значения переменных
nиmпередаются в функциюinput()по ссылке, что позволяет изменять их значения внутри функции. - Переменная
rememberXобъявлена как указатель на указатель на целочисленное значение, что позволяет выделять память под двумерный массив. - В функции
initializatoin_remember()используется оператор&для передачи адреса переменнойrememberXв качестве аргумента, что позволяет изменять значение указателя внутри функции. - Для освобождения памяти, выделенной под массив, следует вызвать функцию
free().