MATRIX* init_matrix (MATRIX* m, int x, int y) { /* PURPOSE: Allocate memory for MATRIX m ACCEPTS: m (MATRIX pointer) x (int) num of rows y (int) num of cols RETURNS: NULL on error, m otherwise REMARKS: */ int i; // loop index // invalid dimensions if (0 >= x || 0 >= y) { return NULL; } free_matrix(m); // allocate new array pointers m->data = (double**)calloc(x, sizeof(double*)); if (NULL == m->data) { return NULL; } // allocate data storage for (i = 0; i < x; i++) { m->data[i] = (double*)calloc(y, sizeof(double)); if (NULL == m->data[i]) { return NULL; } } // assign dimensions m->rows = x; m->cols = y; // allocated successfully return m; } void free_matrix (MATRIX* m) { /* PURPOSE: Frees memory for an allocated MATRIX m ACCEPTS: m (MATRIX pointer) RETURNS: (none) REMARKS: Checks to see if there's anything to free first */ int i; // loop index printf("Inside free()\n"); if (NULL != m->data) { printf("m->data is NOT NULL and has %d rows\n", m->rows); for (i = 0; i < m->rows; i++) { if (NULL != m->data[i]) { printf("row %d is not null and will be free()'d\n", i); free(m->data[i]); } else { printf("row %d is null\n", i); } } printf("m->data is being freed now\n"); free(m->data); } m->data = NULL; }