Search
— Jan Faigl 2026/03/23 08:27
Dotazy z přednášky
Q: Jakým způsobem mohou přetypovat dynamicky alokovaný souvislý blok paměti na dvourozměrné pole o cols sloupcích?
cols
Předně je nutné zajistit, že ukazatel odkazuje na souvislý blok paměti o příslušné velikost. Následně lze definovat proměnnou se specifikací počtu sloupců např. int(*matrix)[cols] = (int(*)[cols])m;, kde m je ukazatel na souvislý blok int hodnot. V kontextu programu to může vypadat, následovně.
int(*matrix)[cols] = (int(*)[cols])m;
m
int
void *alloc(size_t size) { void *ret = malloc(size); if (ret == NULL) { fprintf(stderr, "Malloc fail!"); exit(-1); } return ret; } void print_matrix(int rows, int cols, int m[][cols]) { for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { printf("%2d ", m[r][c]); } printf("\n"); } } int rows = 2; int cols = 3; int *m = alloc(rows * cols * sizeof(int)); for (int i = 0; i < rows * cols; ++i) { m[i] = i + 1; } int(*matrix)[cols] = (int(*)[cols])m; print_matrix(rows, cols, matrix); free(m);
Můžeme toho například využít při řešení HW05, kdy si nejdříve odladíme funkce pro dvojrozměrné pole, které následně můžeme přímo využít pro rozšířenou implementaci s využitím dynamické alokace.
Q: Je nutné v případě dynamicky alokované matice, jako pole ukazatelů na pole hodnot, postupně paměť uvolňovat podobně jako při alokaci?
Ano je. Nejdříve je nutné postupně uvolnit dílčí pole reprezentující sloupce v jednotlivých řádcích a následně pak uvolnit pole ukazatelů (na řádky). S výhodou je možné si definovat funkce pro alokaci a uvolnění paměti, např.
void *alloc(size_t size) { void *ret = malloc(size); if (ret == NULL) { fprintf(stderr, "Malloc fail!"); exit(-1); } return ret; } int **matrix_alloc(int rows, int cols) { int **matrix = alloc(rows * sizeof(int *)); for (int r = 0; r < rows; ++r) { matrix[r] = alloc(cols * sizeof(int)); } return matrix; } void matrix_free(int rows, int cols, int **matrix) { if (matrix) { for (int r = 0; r < rows; ++r) { if (matrix[r]) { free(matrix[r]); } } free(matrix); } }
const int ROWS = 2; const int COLS = 2; int **matrix = matrix_alloc(ROWS, COLS); matrix_free(ROWS, COLS, matrix);
Pragmatičtější však může být použití složeného typu struct.
struct