2

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 の専門家がいる場合は、彼女の助けに感謝します。

どうもありがとうございました!

4

3 に答える 3

2

この警告:

assignment makes pointer from integer without a cast

...キャストを追加するための招待ではありません。より深刻な問題について伝えています。この場合、コンパイラether_ntoa()int.

これは、スコープ内で宣言なしで関数を使用した場合に発生します。このようなライブラリ関数の場合、正しいヘッダーが含まれていないことを意味します。にはether_ntoa()、 が必要#include <netinet/ether.h>です。

于 2010-06-04T04:17:43.073 に答える
0

ライブラリの問題でした。どうやってそれをチェックしなかったのかわかりません(おそらく、必要なすべてのライブラリを備えた教師から提供されたファイルだったからでしょう)。インクルードを行う:

#include <netinet/ether.h>

が解決策だったので、質問は答えられたと思います。

お二方とも、どうぞよろしくお願いいたします。

于 2010-06-04T12:34:13.490 に答える
0

確かに、ヘッダー/ライブラリとコンパイラの間の単語サイズの不一致のように聞こえます。その Suse マシンに 64 ビット環境と 32 ビット環境が混在していませんか?

于 2010-06-04T02:56:30.003 に答える