Выделить память под двумерный массив - C (СИ)
Формулировка задачи:
Есть програмка, нужно сделать что-бы массив mass был двумерный размером 7х4. Malloc должен работать.
#include <stdio.h> /*malloc*/
#include <conio.h>
#include <stdlib.h>
int main(void)
{
float mass;
int count = 0;
int A,C,i,j,**q2,m;
int **q,k;
while(printf("\nplease enter num of elements for mass \n") && scanf("%d", &m))
{
q=(int*)malloc(m*sizeof(int*));
printf("Adress of mass=%p\n", q);
if(q==NULL){puts("no memory \n"); exit(1);}
printf("enter A: ");
scanf("%d", &A);
printf("enter C: ");
scanf("%d", &C);
{for(i = 0; i<m; i++)
{
mass = rand()%100;
q2=malloc(mass*sizeof(int*));
printf("%f ****** Adress of elemt: %p\n", mass, q2);
if((mass>A)&(mass<C))
count++;
}
}
printf("\n\namount elements:%d", count);
}
_getch();
return 0;
}Решение задачи: «Выделить память под двумерный массив»
textual
Листинг программы
#include <stdio.h> /*malloc*/
#include <stdlib.h>
int main(void)
{
int **mass, rows, columns;
int count = 0;
int min,max,i,j;
printf("\nplease enter rows \n");
scanf("%d", &rows);
if ( ( mass = (int**)malloc(sizeof(int*) * rows) ) == NULL )
{
perror("malloc");
exit(1);
}
printf(" Adress of mass=%p\n", mass);
printf("\nplease enter columns \n");
scanf("%d", &columns);
for ( i = 0; i < rows; ++i )
{
if ( ( mass[i] = (int*)malloc(sizeof(int) * columns) ) == NULL )
{
perror("malloc");
exit(1);
}
printf(" Adress of mass[%d]=%p\n", i, &mass[i]);
}
printf("enter min: ");
scanf("%d", &min);
printf("enter max: ");
scanf("%d", &max);
printf("<br>\n");
printf("| Element | Number | Adress |\n");
printf("=================================\n");
for ( i = 0; i < rows; ++i )
{
for ( j = 0; j < columns; ++j )
{
mass[i][j] = rand()%10;
if(i > 0 && j == 0)
printf("|===============================|\n");
printf("|mass[%d][%d]| %d | %p |\n",i, j, mass[i][j], &mass[i][j]);
printf("|===============================|\n");
if((mass[i][j] > min) && (mass[i][j] < max))
count++;
}
printf("\n");
}
printf("\n\namount elements:%d\n", count);
for ( i = 0; i < rows; ++i )
free(mass[i]);
free(mass);
//_getch();
return 0;
}
Объяснение кода листинга программы
- Объявлены переменные:
- int **mass - двумерный массив (указатель на указатель на int);
- int rows - количество строк;
- int columns - количество столбцов;
- int count - счетчик элементов, удовлетворяющих условию;
- int min, max - минимальное и максимальное значение для элементов массива;
- int i, j - индексы для обхода массива;
- char *mass[], **mass[] - указатели на память под массив.
- Пользователю предлагается ввести количество строк.
- Выделена память под массив указателей на int с помощью функции malloc(). Если память не может быть выделена, программа завершается.
- Пользователю предлагается ввести количество столбцов.
- В цикле выделена память под каждый из подмассивов с помощью функции malloc(). Если память не может быть выделена, программа завершается.
- В цикле от 0 до (rows-1) заполняются элементы массива случайными числами от 0 до 9 с помощью функции rand().
- В цикле от 0 до (columns-1) выводятся на экран элементы массива, их номера и адреса в памяти.
- Если элемент больше min и меньше max, к переменной count прибавляется единица.
- По завершении работы с массивом, память освобождается с помощью функции free().