erreur de segmentation pour inet_ntoa

#include  #include  /* for strncpy */ #include  #include  #include  #include  #include  int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); /* display result */ char* ipaddr; ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); printf("%s\n", ipaddr); return 0; } 

pour cette ligne:

  ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 

Je reçois

 iptry.c: In function 'main': iptry.c:31:9: warning: assignment makes pointer from integer without a cast [enabled by default] 

et pour

  printf("%s\n", ipaddr); 

J’ai une faute de segmentation.

Quel est le probleme avec ca?

inet_ntoa est défini dans l’en-tête ,
besoin d’ #include sinon, il y aura des erreurs

inet_ntoa ne demande pas de pointeur, mais de valeur

  char* ipaddr; ipaddr = inet_ntoa(((struct sockaddr_in)(ifr.ifr_addr))->sin_addr); 

Si sin_addr est un pointeur, vous devrez le déréférencer.

inet_ntoa retournera NULL s’il y a une erreur, donc essayer d’ printf un NULL va provoquer une erreur de segmentation …

Regardez ici pour des informations et ici pour la page de manuel.

Si vous ne voulez pas voir l’avertissement, lancez simplement la valeur de retour de inet_ntoa

 ipaddr = (char *) inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 

L’erreur de segmentation est probablement due au fait qu’une partie de la fonction précédente renvoie une erreur (valeur nulle) et que vous ne l’avez pas vérifiée.

Le même code a fonctionné dans ma Linux Box.