defining a 2D array with malloc and modifying it

前端 未结 7 1171
陌清茗
陌清茗 2020-12-01 13:43

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

相关标签:
7条回答
  • 2020-12-01 14:12

    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.

    0 讨论(0)
提交回复
热议问题