我在使用这一小段代码时遇到了一些问题:
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
如果我将两个目录放在同一行,它只打印其中一个。为什么会这样?
答案 0 :(得分:5)
函数的结果存储在静态分配的缓冲区中(例如,每次调用时都在同一个缓冲区中),因此第二个调用会覆盖第一个调用的结果。
ether_aton()转换48位以太网主机地址asc 网络中的二进制数据的标准十六进制数字和冒号表示法 字节顺序并在静态分配中返回指向它的指针 缓冲区,后续调用将覆盖。 ether_aton返回NULL 如果地址无效。
如果你每次尝试打印从通话中返回的指针(printf( '%p', ether_ntoa(s) );
),它应该是相同的......
考虑使用填充调用者提供的缓冲区的ether_aton_r
。