parameter_double_pointer.c에 대해 질문이 있습니다.
allocMemory 함수의 선언 및 정의를
void allocMemory(void **ptr, int size)라고 했습니다.
그리고 함수의 호출은
allocMemory(&numPtr, sizeof(long long));로 함수의 첫번째 인수는 long long *numPtr;로 선언한
numPtr의 주소를 넣었습니다.
(예제의 코드 그대로입니다.)
이를 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0에 넣고 컴파일한 경우,
test.c:14:17: warning: passing argument 1 of ‘allocMemory’ from incompatible pointer type [-Wincompatible-pointer-types]
test.c:4:25:note: expected ‘void **’ but argument is of type ‘long long int **’
4 | void allocMemory(void **ptr, int size)
란 문구가 발생했습니다.
parameter void ** 에 대해 인수를 long long int **로 넣었기에 생기는 경고 같습니다.
(개인적으로는, void ** 와 long long int **의 size는 같고 void에서 long long으로 자료변환이 자동으로 될텐데 pointer to pointer에서는 왜 경고가 뜨는지 모르겠습니다.)
혼자 풀어본 결과 해결책은
allocMemory((void *)&numPtr, sizeof(long long));와 같이 &numPtr 앞에 (void *) 를 붙여주면 경고문이 발생하지 않았습니다.
질문은
1. 교재에 나와있는 방식이 c언어 정식 기준에 부합하지 않는 건지,
(혹은 gcc 컴파일러가 표준에 부합하지 않는 건지)
2. 제가 사용한 방법은 c언어 정식 기준에 부합하는지,
3. 그렇지 않다면 다른 해결방안은 있는지
입니다.
감사합니다.