2016-03-28 21 views
1
#include <netdb.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <netinet/in.h> 

int main(int argc, char** argv) 
{ 
    char *ptr, **pptr; 
    char str[100]; 
    struct hostent *hptr; 
    int  i=0; 

    while(--argc>0) 
    { 
     ptr=*(++argv); 
     if((hptr=gethostbyname(ptr))==NULL) 
     { 
     printf("gethostbyname() error for host: %s: %s", ptr, hstrerror(h_errno)); 
     exit(1); 
     continue; 
     } 

     printf("official hostanme: %s \n", hptr->h_name); 

     for(pptr=hptr->h_aliases; *pptr!=NULL; pptr++) 
     printf("\talias: %s \n", *pptr); 

     switch(hptr->h_addrtype) 
     { 
     case AF_INET: 
     pptr=hptr->h_addr_list; 

     for(; *pptr!=NULL; pptr++) 
      printf("\taddress: %s \n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); 
     break; 

     default: 
     printf("unknown addres type"); 
     break; 
     } 
    } 
    exit(0); 
} 

Neden bu kod bana bölümleme hatası veriyor?gethostbyname() bölümleme hatası

Resmi adı çıkana kadar, sorun değil. Ama bundan sonra, bana bir hata veriyor.

Bu kaynak kodunda sözdizimsel bir sorun olmadığını düşünüyorum. O zaman sorun nedir?

+2

[POSIX.1-2008, gethostbyname(), gethostbyaddr() ve h_errno teknik özelliklerini kaldırır, getaddrinfo (3) ve getnameinfo (3) kullanımını önerir.] (Http://linux.die.net/man/3/gethostbyname) – pmg

+1

Siz * h_aliases'ın işaret ettiği 'char * 'işaretlerinden herhangi birinin NULL olmadığını kontrol edin. Ancak h_aliases'ın kendisi de NULL olabilir (yani başka takma adlar yoktur) - Ve siz * bunu kontrol edemezsiniz. – tofro

+2

Programın çöktüğü kodun tam satırını bulmak için kodu bir hata ayıklayıcının içinde çalıştırmak ve daha sonra neler olup bittiğini öğrenmek için tüm değişkenleri incelemek istiyorsunuz. – alk

cevap

2

64 bitlik bir platform varsayarsak, kod prototip edilmediği için inet_ntop() tarafından döndürülen işaretçi değerini 32bit kaybeder. İkincisinden dolayı derleyici, büyük olasılıkla sadece 32bit genişliğinde olan ve bir işaretçi 64 bit olan bir int döndürdüğünü varsayar.

32bit öğesinin kaybedilmesi, döndürülen işaretçi değerini geçersiz kılar, bu nedenle printf()'a aktarılması, programın nihayetinde çökmesine neden olan tanımlanmamış davranışı çağırır.

Bunu düzeltmek ya da eksik prototip eklemek için:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 

ya da sadece büyük olasılıkla uygun başlığını

#include <arpa/inet.h> 

derleyici içerir bu konuda uyarmıştım. Bu tür uyarıları ciddiye alın ve daha fazla uyarı verilmedikçe kodu düzeltin.

İlgili konular