inet_ntoa 함수사용시 인자로 넘기는 구조체 형 변환이 이해가 안됩니다.


함수 원형이 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)); 이렇게 사용하던데

함수 전달 인자를 저렇게 넘기는 이유가 무엇인지 궁금합니다.

  • 2016년 04월 11일에 작성됨

조회수 210


3 답변


좋아요
0
싫어요
채택취소하기

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;
}

  • 2016년 04월 11일에 작성됨

  • 감사합니다.:) 정확히 이해했습니다. 캐스팅해서 대입해야하는건 알았는데 주소값으로 해야된다는걸 간과했네요.    walli   2016.4.11 16:24     

inet_ntoa 함수는 char *inet_ntoa(struct in_addr in)와 같이 정의되어 있기 때문에 int를 인자로 넘기면 컴파일 오류가 발생합니다. 이 때문에 &ipaddrstruct in_addr *)로 casting한 후 *를 사용하여 그 주소에 있는 값을 읽어오도록 하는 것입니다.

  • 2016년 04월 11일에 작성됨
    Polyglot Programmer


저는 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형으로 변환된 주소값을 (*(......)&....)에서 맨 왼쪽에 있는 *(포인터)로 타고 들어가 접근한 값을

함수에 넘겨주게되네요.

물어보신 거에 알맞게 답변해드렸는지 잘 모르겠네요.

열공하세요~

  • 2016년 04월 11일에 작성됨

  • int의 주소값이라는게 무슨 말씀이시죠? 변수 ipaddr의 시작주소가 넘어가는게 아닌가요?    walli   2016.4.11 16:36     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close