C/C++

Как в функции распечатать двумерный динамический массив в Си

Всем привет, разбираюсь с функциями в Си. Я хочу создать двумерный массив в Си и с помощью отдельных функций его создать и вывести на экран.

В своем коде я собственно задаю функции int** matrix_initialization(int n, int m) , у которой кстати тип указателя на указатель (**) (это вообще правильно? я так поставил потому что были ошибки какие-то у компилятора), параметры как длина строки и длина столбцов, в функции этой же выделяю память под нее и потом с помощью циклов задаю случайные значения.
В следующей функции int print_matrix(int n1, int n2, int** a) (насчет которой я вообще не уверен), я задаю параметры как длина строки, длина столбцов, и некоторый указатель на указатель
 ** int a; 


И я вот не понимаю, я правильно вообще поставил эти параметры? У меня ошибка есть, что функция print_matrix должна возвращать какое-то значение, а какое значение должна она возвращать? Это же по идее функция, которая должна просто печатать матрицу, или я чето не понимаю?

Как в двух отдельных функциях инициализировать матрицу и потом распечатать её ??????

У меня получился такой код:
 #include  
#include
#include
#include

int** matrix_initialization(int n, int m)
{
// Выделение памяти
int** matrix = NULL;
matrix = (int**)malloc(n * sizeof(n));
// Проверки
if (matrix != NULL)
{
if (matrix != NULL)
{
// Выделение памяти
for (int i = 0; i < m; i++)
{
*(matrix + i) = (int*)malloc(m * sizeof(m));
}

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
matrix[i][j] = rand() % 20 - 5;
}
}
}
}
return matrix;
}

int print_matrix(int n1, int n2, int** a)
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n2; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}

int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));

int N, M, **b;
printf("Введите размеры матрицы: ");
scanf_s("%d %d", &N, &M);

b = matrix_initialization(N, M);
print_matrix(N, M, **b);

}
У тебя функция int print_matrix() следовательно она должна возвращать значение типа int.
Обычно так делается для вывода отладочных данных. (вернул 0 значит все ок, вернул число - значит произошла ошибка во время "печати")
Если функция не должна возвращать значений, указывай тип void.
Батыржан Кауымбаев
Батыржан Кауымбаев
5 044
Лучший ответ
Батыржан Кауымбаев
 int** matrix_initialization(int N, int M)
{
int ** matrix = (int**)malloc(N * sizeof(int*));
for (int i = 0; i < N; i++)
{
matrix [i] = (int*)malloc(M * sizeof(int));
for (int j = 0; j < M; j++)
{
matrix[i][j] = rand() % 20 - 5;
}
}
return matrix;
}


void print_matrix(int n1, int n2, int** a)
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n2; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
 #include   
#include
#include
#include

int** matrix_initialization(int n, int m)
{
// Выделение памяти
//int** matrix = NULL; //не обязательное действие
int** matrix = (int**)malloc(n * sizeof(int*)); //основной массив состоит из n указателей, поэтому sizeof(int*)
//а sizeof(n) - тоже самое что sizeof(int)
// Проверки
//if (matrix != NULL) //два одинаковых if - один лишний
//{
if (matrix != NULL)
{
// Выделение памяти
for (int i = 0; i < n; i++) //у вас i
динамический массив через структуру делается а не через инт
//строка
struct foo1
{
int value;
foo1* next ;
};
//матрица
struct foo2
{
foo1* first;
foo2* next ;
};

дальше создаешь указатели только на первую строку матрицы и ходишь по ней двумя вайлами

int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));

int N, M, **b;
printf("Введите размеры матрицы: ");
scanf_s("%d %d", &N, &M);

foo2* matrix=(foo2*)malloc(sizeof(foo2));
foo2* cur2;
foo1* cur1;

cur2=matrix;
//вот так выделяешь не сразу все а построчно поэементно
for(че там у тебя на входе)
{
for(че там у тебя на входе)
{
cur1.next =(foo1*)malloc(sizeof(foo1));
cur1=cur1.next;
}
//создаем следущую строку и переходим на нее
cur2.next=(foo2*)malloc(sizeof(foo2));
cur2=cur2.next;
cur2.first=(foo1*)malloc(sizeof(foo1));
cur1=cur2.first;
//кстати создадим лишнюю строку потомучто изначально одну уже создали
//и лишний элемент
}

cur2=matrix;
cur1=cur2.first;
а ходить по ней двойным вайлом
while (cur2!=null)
{
while(cur1!=null)
{
print(cur1->value);
cur1=cur1.next;
}
cur2=cur2.next;
}

}
Виктор Руднев
Виктор Руднев
17 648
 #include   
#include
#include
#include

int** matrix_initialization(int n, int m)
{
// Выделение памяти
int** matrix = NULL;
matrix = (int**)malloc(n * sizeof(int*));
// Проверки
if (matrix != NULL)
{
if (matrix != NULL)
{
// Выделение памяти
for (int i = 0; i < n; i++)
{
*(matrix + i) = (int*)malloc(m * sizeof(int));
for (int j = 0; j < m; j++)
{
matrix[i][j] = rand() % 20 - 5;
}
}
}
}
return matrix;
}

int print_matrix(int n1, int n2, int** a)
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n2; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}

int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));

int N, M, **b;
printf("Введите размеры матрицы: "); // у меня нет _s
scanf_s("%d %d", &N, &M);
// scanf("%d %d", &N, &M);

b = matrix_initialization(N, M);
print_matrix(N, M, b);

if(b == (int**) NULL) exit(1);
for(int q = 0; q < N; q++)
{
if(b[q] == (int*) NULL) exit(1);
free(b[q]);
b[q] = (int*) NULL;
}
free(b);
b = (int**) NULL;

return 0;
}
 #include  
#include
#include

struct matrix
{
size_t cols, rows;
int **ptr;
};

static struct matrix *matrix_init(size_t rows, size_t cols)
{
int i, j;
struct matrix *mat = malloc(sizeof *mat);

mat->ptr = calloc(rows, sizeof *(mat->ptr));
mat->rows = rows;
mat->cols = cols;

if (mat) {
for (i = 0; i < rows; i++) {
mat->ptr[i] = calloc(cols, sizeof(int));

for (j = 0; j < cols; j++) {
mat->ptr[i][j] = rand() % 20 - 5;
}
}
}

return mat;
}

static void matrix_destroy(struct matrix *mat)
{
int i;

if (mat) {
for (i = 0; i < mat->rows; i++) {
free(mat->ptr[i]);
}

free(mat->ptr);
free(mat);
}
}

static void matrix_print(const struct matrix *mat)
{
int i, j;

for (i = 0; i < mat->rows; i++) {
for (j = 0; j < mat->cols; j++) {
printf("%d\t", mat->ptr[i][j]);
}

printf("\n");
}
}

int main(void)
{
struct matrix *mat;
size_t N, M;

srand(time(NULL));

printf("Введите размеры матрицы: ");
scanf("%zx %zx", &N, &M);

mat = matrix_init(N, M);
matrix_print(mat);
matrix_destroy(mat);
return 0;
}
Azikoooo
Azikoooo
1 893