Re: 63.7 질문있어요
, 도장_ 관리자님이 작성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차원 배열의 세로에 할당하는 게 됩니다. 선언할 때의 포인터 *과 역참조할 때의 *를 혼동한 것 같습니다.