Search code examples
cfunctiondynamic-memory-allocation

dynamic allocation of 2d array function


So I have a program in C structured in 3 files: main.c, alloc.h and alloc.c. In the main.c function, I have the declaration of a pointer to another pointer to which I intend to alloc an n * m array:

#include <stdio.h>
#include <stdlib.h>
#include "alloc.h"

int main() {
   int **mat, n, m;
   alloc_matrix(&mat, int &n, int &m);
   return 0;
}

In alloc.c I have the following declarations:

#ifndef ALLOC_H_INCLUDED
#define ALLOC_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
void alloc_matrix(int***, int*, int*);
#endif

In alloc.c I have the function:

void alloc_matrix(int ***mat, int *n, int *m) {
    printf("\nn = "); scanf("%d", n);
    printf("\nm = "); scanf("%d", m);
    *mat = (int**)calloc(*n, sizeof(int*));
    int i;
    for (i = 0; i < *n; i++)
        *(mat + i) = (int*)calloc(*m, sizeof(int));
}

But the program doesn't work. It enters some kind of loop and doesn't end. If I allocate it in main it would work but I have no idea what I am doing wrong in the alloc function.


Solution

  • Here is the correct code. Your error was that in the definition of alloc_matrix, you used *(mat+i) in the allocation loop, which should be *(*mat+i) as, mat is a int*** so the base address for the 2D array would be in *mat. Then you need to move by offset i and then de-reference that memory location for the 1D array.

    Main:

    #include <stdio.h>
    #include <stdlib.h>
    #include "alloc.h"
    int main()
    {
       int **mat,n,m;
       alloc_matrix(&mat,&n,&m);
       return 0;
    }
    

    alloc.h

    #ifndef ALLOC_H_INCLUDED
    #define ALLOC_H_INCLUDED
    #include <stdio.h>
    #include <stdlib.h>
    void alloc_matrix(int***,int*,int*);
    
    #endif
    

    alloc.c :

    void alloc_matrix(int ***mat,int *n,int *m)
    {
        printf("\nn = "); scanf("%d", n);
        printf("\nm = "); scanf("%d", m);
        *mat = (int**)calloc(*n,sizeof(int*));
        int i;
        for(i = 0; i < *n; i++)
        *(*mat+i) = (int*)calloc(*m,sizeof(int));
    }
    

    The code for the read function :

    void read_matrix(int ***mat,int n,int m)
        {
          int i,j;
          for(i = 0; i < n; i++)
           for(j = 0; j < m; j++)
            {
              printf("mat[%d][%d] = ", i, j);
              scanf("%d", (*(*mat+i))+j);
            }
        }
    

    The problem with it is that it only reads the first row and the it freezes.