C - 使用 %s 和 char * 重复 printf()

发布于 2024-10-20 07:31:20 字数 274 浏览 1 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我的影子我的梦 2024-10-27 07:31:20

从文档中可以看出: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.

若水般的淡然安静女子 2024-10-27 07:31:20

我假设您使用的是 IPv4。此功能不适用于 IPv6;对于 IPv6,请使用 inet_ntop()inet_pton()

该函数返回一个指向inet_ntoa()不断重复使用的静态内部缓冲区的指针。您的 src_addrdst_addr 将都指向同一个缓冲区,并且最后一次调用 inet_ntoa() 创建的字符串将存储在那里。

I am assuming you're using IPv4. This function does NOT work with IPv6; use inet_ntop() or inet_pton() for IPv6.

The function returns a pointer to a static internal buffer that inet_ntoa() keeps re-using. Your src_addr and dst_addr will both point to the same buffer, and the string created by the LAST call to inet_ntoa() will be stored there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文