inet_ntoa 함수사용시 인자로 넘기는 구조체 형 변환이 이해가 안됩니다.
조회수 3389회
함수 원형이 char * inet_ntoa (struct in_add in); 인 함수를 사용하려고 하는데요
int ipaddr = inet_addr("127.0.0.1");
그리고 다시 ip인터넷 주소를 점표기 방식 주소로 변환해서 출력하려고 하는데요
printf("%s \n", inet_ntoa( * (struct in_addr *)&ipaddr)); 이렇게 사용하던데
함수 전달 인자를 저렇게 넘기는 이유가 무엇인지 궁금합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
3 답변
-
in_add라는 구조체가 4바이트인 것 같네요. 포인터를 이용해서 4바이트 int에 있는 값을 구조체에 넣기 위해서 하는 동작인것 같습니다. int에 있는 값을 구조체에 넣는 과정은 다음 예를 참고하세요. 코드 아래의 실행하기를 누르면 코드를 바로 실행해 볼 수 있습니다.
#include <stdio.h> struct Dumnmy_in_add { char part1; char part2; char part3; char part4; }; int main(){ int a=0; struct Dumnmy_in_add*b; //1) b=&a;//a의 메모리 영역을 가리키도록 포인터b에 a의 주소 값을 넣는다. struct Dumnmy_in_add c; c=*b;//c가 b의 메모리 영역에 있는 값을 가지도록 만든다 printf("%d.%d.%d.%d", c.part1,c.part2,c.part3,c.part4); return 0; }
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
inet_ntoa
함수는char *inet_ntoa(struct in_addr in)
와 같이 정의되어 있기 때문에int
를 인자로 넘기면 컴파일 오류가 발생합니다. 이 때문에&ipaddr
을struct in_addr *)
로 casting한 후*
를 사용하여 그 주소에 있는 값을 읽어오도록 하는 것입니다.-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
저는 in_addr형이나 inet_ntoa함수를 잘 모르지만 잠깐 보겠습니다.
(inet_addr)는 (char *)반환형이기 때문에 어떤 문자열의 주소값을 반환하겠네요.
그리고 ipaddr(int형)에 그 주소값을 저장하네요.
그럼 ( * (struct in_addr *)&ipaddr) -> 이 아이를 다시 보죠.
&ipaddr로 int변수의 '주소값'을 가지고 오네요.
여기서 보실건 int안에 있는 주소값을 가져오는게아니라 int의 주소값이란겁니다.
위에 분이 말씀하신거 처럼 (sturct in_addr*)을 사용하여 int의 주소값을 타고 들어가
int에 저장 되어있는 '주소값'을 sturct in_addr 형으로 바꿔줍니다.(이부분에서 햇깔리실수있으신데요. 차근히 생각해보세요. ㅎ)
그리고 in_addr형으로 변환된 주소값을 (*(......)&....)에서 맨 왼쪽에 있는 *(포인터)로 타고 들어가 접근한 값을
함수에 넘겨주게되네요.
물어보신 거에 알맞게 답변해드렸는지 잘 모르겠네요.
열공하세요~
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력