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

조회수 3434회

함수 원형이 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;
    }
    
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다.:) 정확히 이해했습니다. 캐스팅해서 대입해야하는건 알았는데 주소값으로 해야된다는걸 간과했네요. 알 수 없는 사용자 2016.4.11 16:24
  • inet_ntoa 함수는 char *inet_ntoa(struct in_addr in)와 같이 정의되어 있기 때문에 int를 인자로 넘기면 컴파일 오류가 발생합니다. 이 때문에 &ipaddrstruct 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형으로 변환된 주소값을 (*(......)&....)에서 맨 왼쪽에 있는 *(포인터)로 타고 들어가 접근한 값을

    함수에 넘겨주게되네요.

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

    열공하세요~

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • int의 주소값이라는게 무슨 말씀이시죠? 변수 ipaddr의 시작주소가 넘어가는게 아닌가요? 알 수 없는 사용자 2016.4.11 16:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)