Kelsey Brennan
Kelsey Brennan

Reputation: 73

Trying to access address of 2D array in C and getting segmentation fault

I'm a beginner with C, and I'm a little confused about pointers and how they are passed to other functions. I'm working on a project and in my main function, I malloc a 2D array of chars representing a game board.

// In main, allocate 2D array   
char **board = malloc(rows * sizeof(char*));
for (int i = 0; i < rows; i++) {
    board[i] = malloc(cols * sizeof(char)); 
}

A function can be called later which will load a saved version of the game, and thus re-malloc my board variable.

void stringToGame(char ***board, int *rows, int *cols, int *turn, int *winLength) {
    // Set new values for rows and cols based on file
    ...

    // Malloc board 
    *board = malloc(*rows * sizeof(char*));
    for (int i = 0; i < *rows; i++) {
        *board[i] = malloc(*cols * sizeof(char));   
    }

}

When I call the stringToGame method in my main function, I'm passing the address of the board.

stringToGame(&board, &rows, &cols, &turn, &winLength);

Passing the board's address is causing a segmentation fault and I have no idea why.

As a secondary question, do I need to free() my old 2D array for the board before I malloc a new one?

Upvotes: 0

Views: 158

Answers (2)

Spikatrix
Spikatrix

Reputation: 20244

This

*board[i] = malloc(*cols * sizeof(char));

should be

(*board)[i] = malloc(*cols * sizeof(char));

because the array subscript operator [] has higher precedence than the indirection operator * and hence will execute first but you need the opposite to happen, i.e, first *, then [i].

Upvotes: 1

Jarvis
Jarvis

Reputation: 8564

First, what you have declared is not a 2-d array, it's a double pointer. There is a difference between these two.

Second, you don't need to pass the address of the array to the function, since arrays are passed by reference anyways. You can simply pass a double-pointer to your function after malloc-ing it.

stringToGame(board, &rows, &cols, &turn, &winLength);

And the answer to your secondary question, yes, you should free your old pointer first, before you malloc it again, otherwise your program will have a memory leak. The first value of board will be lost and you will not be able to free it.

Upvotes: 0

Related Questions