함수의 인자로 더블 포인터를 받는 이유가 뭔가요?
글쓴이: superkkt / 작성시간: 일, 2006/01/08 - 1:58오후
포인터의 포인터를 더블포인터라고 부르는거 맞나요? 마땅한 호칭을 모르겠네요..
어떤 함수는 인자로 더블포인터를 받는 경우가 있습니다. 예를들어 아래와 같은 함수요..
int getaddrinfo(const char *restrict nodename, const char *restrict servname, const struct addrinfo *restrict hints, struct addrinfo **restrict res);
마지막 res 인자를 더블포인터로 받는데요.. 저 함수는 실행 결과를 res가 가르키는 구조체에 넣어주는데.. 굳이 저렇게 더블포인터를 안쓰고 그냥 일반 포인터를 사용해도 충분히 같은 동작을 할 수 있지 않나요?
저런 상황에서 왜 더블포인터를 쓰는지 궁금합니다.
Forums:
res 자체를 바꾸기 위해서가 아닐까요? 만약 res = NULL; 일
res 자체를 바꾸기 위해서가 아닐까요? 만약 res = NULL; 일 경우라던지... 그런 경우도 대비하기 위한게 아닐까 싶습니다 :)
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Re: 함수의 인자로 더블 포인터를 받는 이유가 뭔가요?
man 페이지를 보니 더욱 확실해지네요
res 구조체에 결과를 넣어주는게 아니라 동적으로 할당해서 ai_next 멤버로 연결시켜주는 구조이므로... 만약 리스트가 비어있을 경우를 대비해서 pointer 의 pointer 로 받는 것입니다.
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[code:1]int func(char **ptr)&#
이것과 비슷한 경우군요.. 그런데 이 코드를 아래처럼..
이렇게 해도 되던데요.. 두 경우의 차이점을 확실히 모르겠습니다. 살짝 이해가 되는듯하면서도 좀 더 생각하면 복잡해지고.. 아~ 또 포인터 때문에 머리 아파지는군요.. :oops:
======================
BLOG : http://superkkt.com
[quote="superkkt"][code:1]int func(c
아래코드는 함수 밖에서 확인하면 ptr 값은 변화가 없을텐데요?
위와 같은 코드를 컴파일해서 돌려보시기 바랍니다 :)
분명히 ptr 값은 변하지 않은 걸 확인할 수 있습니다.
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[quote="superkkt"][code:1]int func(c
2번째 소스는 함수 처음에 malloc을 바로 한다면..다음코드와
마찬가지입니다.
1번째 소스와는 엄청난 차이가 있죠^^.
이제 좀 이해가 되었습니다. 이것도 역시 결국엔 call by value
이제 좀 이해가 되었습니다. 이것도 역시 결국엔 call by value와 call by reference의 차이점인듯 싶네요.. 포인터 변수 자체를 바꾸고 싶으면 pointer의 pointer로 넘겨야 하는거죠?
음..그런데 pointer의 pointer를 뭐라고 부르나요? 이중 포인터? 더블 포인터?
======================
BLOG : http://superkkt.com
이중포인터? 더블포인터?
우리말로 할땐 이중포인터, 영어로 할땐 더블포인터 ^^
이것도 job interview 할때 나왔던 문제네요 ;)
vio:
return 에 따른 값의 결정입니다.
double pointer 에 대해서 복잡하게 생각하는 경향이 짙은데, 이는 call by value 나 call by ref. 의 문제라고 할 수는 없습니다. 단지 함수 디자인에 따라서 결정됩니다. 다음과 같은 경우를 봅시다.
이 함수의 리턴값인 char * 형이 인수로 넘어가는 경우(reentrant 디자인, 바로 아래에 더 설명했음)에는 double pointer 가 되어야 합니다. 그 이유는 char * 를 리턴해야 하므로 이 주소값의 주소가 호출되어야 하기 때문입니다. 따라서 아래와 같은 형태로 바꾸어 쓸 수 있습니다. 이 경우에 ret_str은 앞의 리턴값이 인수로 들어온 형태입니다. 만일 NULL이 리턴되는 경우를 생각해보면 single pointer 가 지정되면 넘겨준 주소 자체를 잃어버리겠죠? 따라서 double pointer가 사용되는게 지극히 당연하다는 것을 알 수 있으실 겁니다.
이런 디자인의 함수는 REENTRANT 처리를 위한 함수에서 종종 등장합니다. reentrant 는 함수가 비동기적 호출로 인해서 재진입 될때 서로가 간섭되지 않아야 합니다. 그러기 위해서는 주소값을 리턴(대개 static 변수의 사용하는 리턴의 경우)가 제외되어야 하기 때문에 두번째 방식의 디자인을 선호합니다. 물론 위의 경우는 reentrant와 상관없이 별 문제가 없어보이지만, 일반적으로 쓰레드 함수의 경우를 생각해보면 리턴값의 형으로 포인터를 리턴하지는 않지요.
따라서 쓰레드 함수에서도 이와 비슷한 형태의 함수를 볼 수 있는데, 예로 pthread_join()함수가 있지요. 이 함수는 void * 형태의 리턴값의 주소를 가져와야 하기 때문에 void ** 형을 인수로 받습니다.
========================================
* The truth will set you free.
댓글 달기