Как в функции распечатать двумерный динамический массив в Си
Всем привет, разбираюсь с функциями в Си. Я хочу создать двумерный массив в Си и с помощью отдельных функций его создать и вывести на экран.
В своем коде я собственно задаю функции int** matrix_initialization(int n, int m) , у которой кстати тип указателя на указатель (**) (это вообще правильно? я так поставил потому что были ошибки какие-то у компилятора), параметры как длина строки и длина столбцов, в функции этой же выделяю память под нее и потом с помощью циклов задаю случайные значения.
В следующей функции int print_matrix(int n1, int n2, int** a) (насчет которой я вообще не уверен), я задаю параметры как длина строки, длина столбцов, и некоторый указатель на указатель
** int a;
И я вот не понимаю, я правильно вообще поставил эти параметры? У меня ошибка есть, что функция print_matrix должна возвращать какое-то значение, а какое значение должна она возвращать? Это же по идее функция, которая должна просто печатать матрицу, или я чето не понимаю?
Как в двух отдельных функциях инициализировать матрицу и потом распечатать её ??????
У меня получился такой код:
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
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.
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
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<m что не верно. Мы инициализируем строки - поэтому нужно количество строк
{
*(matrix + i) = (int*)malloc(m * sizeof(int)); //если в пером случае была проверка, то здесь ущимили в правах?
//if(!matrix[i]) exit(-1); //если память не выделилась завершить программу
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
matrix[i][j] = rand() % 20 - 5;
}
}
}
// else exit (-1); //если память не выделилась - завершить программу.
//}
return matrix;
}
void print_matrix(int n1, int n2, int** a) //тип функции - void так как ничего возвращать не планируем
{
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); //передаем указатель b как есть. **b - это уже двойное разыменовывание и возврат первого элемента массива
//забыли вернуть память с указателей b[0]....b[n-1] и b системе (хотя если программа завершается - система сама заберет).
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
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;
}
динамический массив через структуру делается а не через инт
//строка
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;
}
}