🔲13. Организация двумерных массивов (матриц). Статическое и динамическое выделение памяти под матрицу

Способы динамического выделения памяти под матрицу. Передача матриц в функции.

Двумерный массив - это массив одномерных массивов. В одномерном массиве положение элемента определяется одним индексом, а в двумерном — двумя.

Статическое выделение памяти

float mat[4][4]; - создание матрицы 4x4. Первое число - строки, второе - столбцы

Динамическое выделение памяти:

  1. Линейный способ. (Все элементы матрицы будут располагаться друг за другом: сначала все элементы 0 строки, затем все элементы первой и т.д.)

void* alloc_memory_matrix (int row, int col, size_t element_size){
    return malloc(row * col* element_size);
}
  1. Стандартный способ выделения памяти.

double** alloc_memory_matrix(int row, int col)
{
    double **mat = (double**) malloc(row * sizeof(double*));
    if (mat != NULL) {
        for (int i = 0; i < row; i++) {
            *(mat + i) = (double*) malloc(col *sizeof(double));
            if (*(mat + i) == NULL) {
                while (--i >= 0)
                    free (*(mat + i));
                free(mat);
                mat = NULL;
                break;
            }
        }
    }
    return mat;
}
  1. Способ выделения памяти единым блоком с сохранением указателей на строки

При таком способе выделения памяти, память сразу же выделяется под указатели на строки и под каждый элемент в частности. Далее устанавливается соответствие между указателем на строку и первым элементом строки.

double** alloc_memory_matrix(int row, int col)
{
    double** mat = (double**) malloc(row * sizeof(double*) + row * col * sizeof(double));
    double *mat_body = (double*)(mat + row);
    for (int i = 0; i < row; i++){
        *(mat + i) = mat_body + i * col;
    }
    return mat;
}

Передача двумерных массивов в функции

int fun(int array[n][m])

int fun(int *array[m])

int fun(int **array)

Last updated