Re: 63.3과 63.7 역참조 질문입니다.
, 도장_ 관리자님이 작성그림 38-3을 보고 포인터를 다시 이해하는 게 좋을 것 같습니다.
지금 타입을 이해한 게 아니라 *ptr 같은 모양으로 이해하려는 오류를 저지르고 있습니다.
short **matrix;
// m: 3, n: 3, 요소의 자료형 short
allocMatrix(&matrix, 3, 3, sizeof(short));
여기서 matrix의 정확한 타입 명칭은
pointer to pointer to short입니다.
allocMactrix에서는 &matrix로 썼습니다.
이는
address of pointer to pointer to short
입니다.
address of와 pointer to는 모두 주솟값을 뜻합니다. 그래서 둘은 호환됩니다.
pointer to pointer to pointer to short와 호환이 됩니다.
따라서 allocMatrix 함수 정의는 다음과 같이 됩니다.
void allocMatrix(void ***ptr, int m, int n, int elementSize)
여기서 ptr의 타입은
pointer to pointer to pointer to short
입니다.
allocMatrix 안에서의 코드는
*ptr = malloc(sizeof(void *) * m);
이렇게 되어 있습니다.
*ptr로 역참조했을 때 역참조의 대상은
pointer to pointer to short
입니다.
*ptr의 모양만 보고 "pointer to"로 이해하면 곤란합니다. 타입이 맞지 않습니다.
실제로
short *error를 선언해보고
short = malloc(sizeof(void *) * m);이렇게 하면 오류 발생합니다. 타입 미스매치.
2차원 배열을 위한 메모리를 할당해야 합니다. 2차원 배열의 주소를 전달해야 하죠. 그래서 & 연산자를 사용한 것입니다.
2차원 배열이 short **matrix처럼 포인터 형태로 표현되어 있을 뿐이죠.
어쨌든 함수에 전달해서 메모리를 할당하려면 matrix 자체의 주소를 보내야 하니까 &matrix를 써야 합니다.
참고하세요.