ether_ntoa を使用して MAC アドレスを出力しようとしています。やろうとすると
printf("MAC (src): %s\n",ether_ntoa((struct ether_addr *)&eheader->ether_shost));
セグメンテーション違反が発生したため、2 つの異なるアプローチを考え出しました。
これはスニペット コード nº1 です。
struct ether_header *eheader;
char *p;
...
p = ether_ntoa(struct ether_addr *) &eheader->ether_shost);
printf("-MAC (src): %s\n",p);
そして、私が得る警告は次のとおりです。
割り当ては、キャストなしで整数からポインターを作成します
だから私はキャストをして...
これはスニペット コード nº2 です。
struct ether_header *eheader;
char *p;
...
p = (char *) ether_ntoa((struct ether_addr *) &eheader->ether_shost);
printf("-MAC (src): %s\n",p);
そして、私が得る警告は次のとおりです。
異なるサイズの整数からポインタにキャスト
man ページを見ると、ether_ntoa はこのように定義されており、char *を返します。
extern char *ether_ntoa (__const struct ether_addr *__addr) __THROW;
だから私は自分が間違っていることを知りません。問題は警告ではなく、印刷しようとしたときに発生するセグメンテーション違反です。
openSUSE でこのエラーが発生しています (ubuntu では、この *p トリックを実行する必要はありません)。ここに openSUSE の専門家がいる場合は、彼女の助けに感謝します。
どうもありがとうございました!