JUSEOK KO
JUSEOK KO

Reputation: 69

Dynamic memory allocation with / without function

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.

Upvotes: 0

Views: 47

Answers (1)

MikeCAT
MikeCAT

Reputation: 75062

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

Upvotes: 2

Related Questions