3

この小さなコードに問題があります:

int main(int argc, char **argv){
struct ether_addr *s, *d;

u_char dir1[] = {0x00,0x11,0x22,0x33,0x44,0x55};
u_char dir2[] = {0x66,0x77,0x88,0x99,0xaa,0xbb};

s = dir1;
d = dir2;

printf("Together: %s\t%s\n",ether_ntoa(s),ether_ntoa(d));

printf("Apart: %s\t",ether_ntoa(s));
printf("%s",ether_ntoa(d));}

出力は同じはずですが、実際には次のようになります。

Together: 66:77:88:99:aa:bb 66:77:88:99:aa:bb
Apart: 0:11:22:33:44:55 66:77:88:99:aa:bb

両方のディレクトリを同じ行に入れると、そのうちの 1 つだけが出力されます。なぜそれが起こっているのですか?

4

1 に答える 1

5

関数の結果は、静的に割り当てられたバッファー (たとえば、呼び出されるたびに同じバッファー) に格納されるため、2 番目の呼び出しは最初の呼び出しの結果をオーバーライドします。

ether_aton() は、48 ビットのイーサネット ホスト アドレス asc を、標準の 16 進数とコロンの表記からネットワーク バイト オーダーのバイナリ データに変換し、静的に割り当てられた バッファーにポインターを返します。これは、後続の呼び出しで上書きされます。アドレスが無効な場合、ether_aton は NULL を返します。

毎回呼び出しから返されたポインターを出力しようとすると ( printf( '%p', ether_ntoa(s) );)、同じになるはずです...

ether_aton_r代わりに、呼び出し元によって提供されたバッファを埋める whichを使用することを検討してください。

于 2013-10-15T13:56:46.790 に答える