0

I tried creating function that dynamically allocates memory for 2 dimensional array and put some integer values into the array. Overall, the function worked as expected but there were some error. So I did the same thing within main() and got the right result. My code is like below:

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

void test(int d1, int d2, int ***p){
    int value;
    *p = (int **)(malloc(sizeof(int)*d1));
    for (int i = 0; i < d1; i++){
        (*p)[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j = 0; j < d2; j++){
            (*p)[i][j] = i * 10 + j;
        }
    }
    printf("\n");
}


int main(void){
    int d1, d2;
    int ** ptr;

    printf("length of 1st dimension?\n");
    scanf("%d", &d1);
    printf("length of 2nd dimension?\n");
    scanf("%d", &d2);
    test(d1, d2, &ptr);
    for (int i=0; i<d1; i++){
        for (int j=0; j<d2; j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    ptr = (int **)(malloc(sizeof(int)*d1));
    for (int i=0; i< d1; i++){
        ptr[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j=0; j<d2; j++){
            ptr[i][j] = i *10 +j;
        }
    }   

    printf("\n######################\n\n");

    for (int i=0;i<d1;i++){
        for (int j=0; j<d2;j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    return 0;
}`

When I passed 5 as a length of 1st and 2nd dimension, I got the result like below:

length of 1st dimension?
5
length of 2nd dimension?
5

532699424 32725 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

######################

0 1 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

I think, except that I passed pointer to pointer to pointer as an argument to the function, I did the same thing. However some values in the first row are different. And I got different value for the first row whenever I executed the function.

Could someone please let me know what I did wrong?

Thank you in advance.

JUSEOK KO
  • 69
  • 7
  • 1
    The calls to `free(ptr)` both leak lots of memory. You have to work a lot harder to free these arrays. You probably need a function to do the job properly (at least, to avoid writing the same code twice). – Jonathan Leffler Nov 15 '20 at 14:06

1 Answers1

2

The lines

    *p = (int **)(malloc(sizeof(int)*d1));
    ptr = (int **)(malloc(sizeof(int)*d1));

are wrong. The elements is int*, but only room for int is allocated per element. This may cause trouble if int* is larger than int (for example, when int* is 8 bytes and int is 4 bytes).

The lines should be

    *p = malloc(sizeof(int*)*d1);
    ptr = malloc(sizeof(int*)*d1);

or (with risk of making mistake reduced by avoiding writing type manually)

    *p = malloc(sizeof(*p)*d1);
    ptr = malloc(sizeof(*ptr)*d1);

See also: c - Do I cast the result of malloc? - Stack Overflow

MikeCAT
  • 73,922
  • 11
  • 45
  • 70