How do i define a 2D array using malloc ? (lets say 10X20).
second, can i increase number of rows or cols without creating a new increased array and copying all data
Instead of using int[row][col]
you should better "wrap your matrix" into a one-dimensional array int[row*col]
.
Here is sample code:
#include <stdio.h>
#include <stdlib.h>
#define DET_MALLOC_FAIL -1
#define DET_READ_FAIL -2
#define DET_WRITE_FAIL -3
typedef struct det_matrix_s {
double * vect;
size_t order;
} det_matrix;
void *det_sf_malloc(size_t dsize);
det_matrix * det_matrix_new(size_t order);
#define DET_MAT_ELEM(matr, i, j) \
((matr)->vect[((matr)->order * (i)) + (j)])
int det_matrix_read(det_matrix * matr, FILE * src);
int det_matrix_write(det_matrix * matr, FILE * dest);
void det_matrix_delete(det_matrix * matr);
/**
* Malloc wrapper
*/
void * det_sf_malloc(size_t dsize)
{
void *data = malloc(dsize);
if(NULL == data){
exit(DET_MALLOC_FAIL);
}
return (data);
}
/**
* Allocates memory for a new matrix
*/
det_matrix * det_matrix_new(size_t order)
{
det_matrix * res = det_sf_malloc(1 * sizeof(*res));
double * vect = det_sf_malloc(order * order * sizeof(*vect));
res->order = order;
res->vect = vect;
return (res);
}
/**
* Reads matrix
*/
int det_matrix_read(det_matrix * matr, FILE * src)
{
size_t i, j;
if(NULL == matr || NULL == src){
return (DET_READ_FAIL);
}
for(i = 0; i < matr->order; ++i){
for(j = 0; j < matr->order; ++j){
if(stdin == src){
fprintf(stdout, "mat[%d][%d] = ", i, j);
}
fscanf(src, "%lf", &DET_MAT_ELEM(matr, i, j));
}
}
return (EXIT_SUCCESS);
}
/**
* Writes matrix
**/
int det_matrix_write(det_matrix * matr, FILE * dest)
{
size_t i, j;
if(NULL == matr || NULL == dest){
return (DET_WRITE_FAIL);
}
for(i = 0; i < matr->order; ++i){
for(j = 0; j < matr->order; ++j){
fprintf(dest, "%5.2lf ", DET_MAT_ELEM(matr, i, j));
}
fprintf(dest, "\n");
}
return (EXIT_SUCCESS);
}
/**
* Free memory for matrix
*/
void det_matrix_delete(det_matrix * matr)
{
free(matr->vect);
free(matr);
}
/**
* Main
*/
int main(int argc, char * argv[])
{
det_matrix * mat = det_matrix_new(3);
det_matrix_read(mat, stdin);
det_matrix_write(mat, stdout);
det_matrix_delete(mat);
return (EXIT_SUCCESS);
}
If re-allocation is an issue, than problems may appear. And you should use the bi dimensional version.