2017-02-23 1 views
0

저는 초보자로서 포인터에 대해 조금 혼란스러워하며 다른 함수로 전달되는 방법에 대해 약간 혼란스러워합니다. 나는 프로젝트에서 일하고 있는데, 나의 주요 기능에서는 게임 보드를 나타내는 숯의 2D 배열을 malloc했다.C에서 2 차원 배열의 주소에 액세스하려고하고 세분화 오류가 발생합니다.

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

나중에 함수를 호출하여 저장된 버전의 게임을로드하므로 내 보드 변수를 다시 malloc 할 수 있습니다.

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)); 
    } 

} 

주 기능에서 stringToGame 메서드를 호출 할 때 보드의 주소를 전달합니다.

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

보드의 주소가 세그먼트 오류를 ​​일으키는 나는 아무 생각이 왜 전달.

두 번째 질문으로, 새로운 하나의 malloc을 만들기 전에 보드의 기존 2D 배열을 해제해야합니까?

+0

보드를 할당/재 할당하기위한 전용 기능이 있다면 코드 관리가 쉬워집니다. –

+0

@ M.M 그게 일할 수있게되면 곧 그 계획이야! –

답변

1

배열 첨자 연산자 [] 먼저 실행됩니다 따라서 간접 연산자 *보다 높은 우선 순위를 가지고 있기 때문

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

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

을해야하지만 즉, 일어날 반대해야 먼저 *, 그 다음에 [i].

0

먼저 선언 한 내용은 2-d array이 아니며 이중 포인터입니다. 이 두 가지 사이에는 difference이 있습니다.

둘째, 어레 이용으로 배열을 전달하기 때문에 배열의 주소를 함수에 전달할 필요가 없습니다. 함수를 두 번 할당 한 후 함수에 이중 포인터를 전달하면됩니다. 당신이 다시 malloc에 ​​전에

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

그리고 보조 질문에 대한 대답은, 그래, 그렇지 않으면 프로그램이 메모리 누수가됩니다, 먼저 이전 포인터를 free한다. board의 첫 번째 값이 손실되고이를 해제 할 수 없습니다.

+1

'stringToGame' 함수는 보드를 재 할당하므로'board'를 값으로 전달하면 작동하지 않습니다 –