안녕하세요
38.3에서 다중포인터로 배열형식을 만들때 하기와 같이 이중포인터를 사용해서
가로 배열 만들고 세로배열을 만드는거로 배웠습니다
int** m = malloc(sizeof(int*) * 3);
for (int i = 0; i < 3; i++)
{
m[i] = malloc(sizeof(int) * 4);
}
63.7에 와서 보니 하기와 같이 되어있어서 그 이유를 알고싶습니다
main 함수에 있는 short **matrix; 가 이중포인터라서 void ***ptr 삼중포인터로
받는건 알겠는데 배열 생성을 하는데 왜 *ptr이 되나요??
void allocMatrix(void ***ptr, int m, int n, int elementSize)
{
*ptr = malloc(sizeof(void *) * m);
for (int i = 0; i < m; i++)
{
(*ptr)[i] = malloc(elementSize * n);
}
세로 배열 생성할때는 **ptr = malloc(sizeof(void *) * m);
가로 배열 생성할때는 *ptr[i] = malloc(sizeof(elementSize) * n);
이 되어야 되는게 아닌가요
해설을 봐도 이해가 잘 안되네요..
38.3은 호출 없이 생성했고,
63.7은 호출한 함수 안에서 생성합니다.
38.3에서
int **m = malloc(sizeof(int *) * 3);
이는 2차원 배열을 선언하면서 할당한 것입니다. 그러니까 **m이 맞습니다.
세로 배열 생성할때는 **ptr = malloc(sizeof(void *) * m);
네, 맞습니다.
단, 선언과 함께 생성할 때입니다.
int **ptr = malloc(sizeof(void *) * m);
이렇게 되어야 합니다.
한 줄에 하지 않고 두 줄로 풀면
int **ptr;
ptr = malloc(sizeof(void *) * m);
이렇게 되겠죠.
UNIT 63.7에서는 2중 포인터를 함수로 전달 받았습니다.
따라서 2중 포인터를 다시 주소로 전달하기 위해 3중 포인터 ***ptr를 썼습니다.
위에 두 줄로 나눈 것처럼 생각해야 합니다. 생성은 함수 생성전에 했고, 함수 안에서는 생성된 포인터에 메모리를 할당해야 하죠.
단, 2중 포인터를 함수에 전달하기 위해 3중 포인터로 했으니
ptr = ...
이렇게 쓰면 3중 포인터에 할당하는 게 됩니다.
역참조를 해서 *ptr로 써야 2중 포인터, 즉 2차원 배열의 세로에 할당하는 게 됩니다. 선언할 때의 포인터 *과 역참조할 때의 *를 혼동한 것 같습니다.