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

如果我将两个目录放在同一行,它只会打印其中一个。为什么会这样?

4

1 回答 1

5

函数的结果存储在静态分配的缓冲区中(例如,每次调用时都存储在同一个缓冲区中),因此第二次调用会覆盖第一次调用的结果。

ether_aton() 将 48 位以太网主机地址 asc 从标准的十六进制数字和冒号表示法转换为网络字节顺序的二进制数据,并在静态分配的 缓冲区中返回指向它的指针,后续调用将覆盖该指针。如果地址无效,ether_aton 返回 NULL。

If you try and print the pointer returned from the call each time ( printf( '%p', ether_ntoa(s) ); ), it should be the same...

Consider using ether_aton_r which fills a buffer supplied by the caller instead.

于 2013-10-15T13:56:46.790 回答