Home > Back-end >  Segmentation Fault C Arrays and Malloc
Segmentation Fault C Arrays and Malloc

Time:04-22

I am trying to initialize an arary using a function but I feel like theres something not right about it. When I compile it I am getting Segmentation Fault but not sure where about. Can someone point me in the right direction where I got wrong. I mean if theres a better way to do it feel free to comment. Thank you.

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

void initialize(int ** arr, int row, int col)
{
    int i; 

    arr = (int **) malloc(sizeof(int *) *col);
    for(i = 0; i < row; i  )
    {
        arr[i] = (int *) malloc(sizeof(int) * row); 
    }

}

void freeArray(int ** arr)
{
    free(arr);
}


int main()
{
    int **arr;
    int r, c; 

    initialize(arr, 3,6); 

    for(r = 0; r <= 3; r  )
    {
        for(c = 0; c <= 6; c  )
        {
            printf("%d ", arr[r][c] = r*c);
        }
        printf("\n");
    }

    freeArray(arr);
}

CodePudding user response:

For starters the function has a bug.

void initialize(int ** arr, int row, int col)
{
    int i; 

    arr = (int **) malloc(sizeof(int *) *col);
    for(i = 0; i < row; i  )
    {
        arr[i] = (int *) malloc(sizeof(int) * row); 
    }

}

Instead of using the variable col in this statement

    arr = (int **) malloc(sizeof(int *) *col);

you have to use the variable row

arr = (int **) malloc(sizeof(int *) *row);

And in this statement instead of using the variable row

arr[i] = (int *) malloc(sizeof(int) * row); 

you have to use the variable col

arr[i] = (int *) malloc(sizeof(int) * col); 

As for the main problem then the function accepts the pointer declared in main by value. It means that the function deals with a copy of the pointer. Changes of the copy do not reflect on the original pointer.

Either you need to pass the pointer to the function indirectly through a pointer to it (passing by reference) like

void initialize(int *** arr, int row, int col)
{
    int i; 

    *arr = (int **) malloc(sizeof(int *) *row);
    for(i = 0; i < row; i  )
    {
        ( *arr )[i] = (int *) malloc(sizeof(int) * col); 
    }

}

and the function is called like

initialize( &arr, 3,6);

Or it is better when the function allocates arrays and returns a pointer to the arrays like

int ** initialize( int row, int col)
{
    int **arr;

    arr = (int **) malloc(sizeof(int *) *row);
    for( int i = 0; i < row; i  )
    {
        arr[i] = (int *) malloc(sizeof(int) * col); 
    }

    return arr;
}

and the function is called like

int **arr = initialize( 3, 6 );

Also in the nested for loops in main there are used invalid conditions

for(r = 0; r <= 3; r  )
{
    for(c = 0; c <= 6; c  )
    {
        printf("%d ", arr[r][c] = r*c);
    }
    printf("\n");
}

You have to write

for(r = 0; r < 3; r  )
{
    for(c = 0; c < 6; c  )
    {
        printf("%d ", arr[r][c] = r*c);
    }
    printf("\n");
}

Also the function freeArray must be declared and defined the following way

void freeArray(int ** arr, int row)
{
    if ( arr != NULL )
    {
        for ( int i = 0; i < row; i   )
        {
            free( arr[i] );
        }
    }

    free( arr );
}

and called like

freeArray(arr, 3);

Pay attention to that in general you need to check whether memory was successfully allocated before using pointers that point to dynamically allocated memory.

  • Related