使用带有%s和char *的printf时出现问题

时间:2013-10-15 13:54:14

标签: c printf

我在使用这一小段代码时遇到了一些问题:

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 个答案:

答案 0 :(得分:5)

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

  

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

如果你每次尝试打印从通话中返回的指针(printf( '%p', ether_ntoa(s) );),它应该是相同的......

考虑使用填充调用者提供的缓冲区的ether_aton_r