C - 使用 %s 和 char * 重复 printf()
char * src_addr;
char * dst_addr;
src_addr = inet_ntoa(ip->ip_src);
printf("src: %s\n", src_addr);
dst_addr = inet_ntoa(ip->ip_dst);
printf("dst: %s\n", dst_addr);
printf("src: %s\n", src_addr);
这将在第三个 printf 语句中输出 dst_addr。我做错了什么吗?
char * src_addr;
char * dst_addr;
src_addr = inet_ntoa(ip->ip_src);
printf("src: %s\n", src_addr);
dst_addr = inet_ntoa(ip->ip_dst);
printf("dst: %s\n", dst_addr);
printf("src: %s\n", src_addr);
This will output the dst_addr in the third printf statement. Am I doing something wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
从文档中可以看出:inet_ntoa() 在静态缓冲区中返回点和数字字符串,每次调用该函数时都会覆盖该字符串。
因此,在您的情况下,对 inet_ntoa 的第二次调用会为您提供一个新字符串,但在同一缓冲区中,因此 dst_addr 指向与 src_addr 相同的内容,现在它们都指向新的目标字符串。
From the documentation: inet_ntoa() returns the dots-and-numbers string in a static buffer that is overwritten with each call to the function.
So, in your case the second call to inet_ntoa gives you a new string but in the same buffer, so dst_addr points to the same as src_addr, which now both point to the new destination string.
我假设您使用的是 IPv4。此功能不适用于 IPv6;对于 IPv6,请使用
inet_ntop()
或inet_pton()
。该函数返回一个指向
inet_ntoa()
不断重复使用的静态内部缓冲区的指针。您的src_addr
和dst_addr
将都指向同一个缓冲区,并且最后一次调用inet_ntoa()
创建的字符串将存储在那里。I am assuming you're using IPv4. This function does NOT work with IPv6; use
inet_ntop()
orinet_pton()
for IPv6.The function returns a pointer to a static internal buffer that
inet_ntoa()
keeps re-using. Yoursrc_addr
anddst_addr
will both point to the same buffer, and the string created by the LAST call toinet_ntoa()
will be stored there.