The memory of a dynamic matrix can be allocated at run time as opposite to the static matrices (who are allocated at compile-time).
/* * Description: * Allocates dinamically memory for a rows x columns matrix * Parameters: * matrix - a pointer to the matrix which will be allocated * rows - the number of rows * columns - the number of columns * Returns: * matrix - a pointer to the allocated matrix */ int** Matrix_Alloc(int** matrix, int rows, int columns) { int i; matrix=malloc(sizeof(int)*rows*columns); if(matrix!=NULL) { /*Allocating space for each row*/ for(i=0; i<rows;i++) { matrix[i] = malloc(sizeof(int)*columns); if(matrix[i]==NULL) { return NULL; } } } return matrix; }
/* * Description: * Frees a dynamically allocated matrix * Parameters: * matrix - a pointer to an allocated matrix * rows - the number of rows * columns - the number of columns * Returns: * Nothing */ void Matrix_Free(int** matrix, int rows) { int i; for(i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); }Here's an example on how to use the functions:
#include<stdio.h> #include<stdbool.h> #include<stdlib.h> int** Matrix_Alloc(int** matrix, int rows, int columns); void Matrix_Free(int** matrix, int rows); void Matrix_Print(int** matrix, int rows, int columns) { int i,j; for(i=0; i<rows;i++) { for(j=0; j<columns; j++) { printf("%d ",matrix[i][j]); } putchar('\n'); } } int main(void) { int **matrix = NULL; int i, j; /*Allocating the matrix*/ matrix = Matrix_Alloc(matrix, 3, 3); /*Assigning values to the matrix*/ for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { matrix[i][j] = (i+j); } } /*Printing the results*/ Matrix_Print(matrix,3,3); /*Freeing the memory*/ Matrix_Free(matrix,3); puts("Memory freed"); return 0; } /*Output 0 1 2 1 2 3 2 3 4 Memory freed */In the example above we used a primitive data type. If we would had use a structure, each element of the matrix would had to be allocated/freed as well.
No comments:
Post a Comment
Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!