关于inet_ntoa的问题

本文探讨了使用inet_ntoa函数时出现的地址打印错误现象。通过一个简单的C语言程序示例,展示了当在同一printf语句中多次调用inet_ntoa时,由于其返回值存储在静态内存中而导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <winsock2.h>
#include
<stdio.h>

#pragma comment( lib, "ws2_32.lib" )

struct sockaddr_in server_addr;
struct sockaddr_in client_addr;

int main(void)
{
long a =0x102030FF;
long b =0x405060FF;

memcpy((
char*)&server_addr.sin_addr, (char*)&a, sizeof(server_addr.sin_addr));
memcpy((
char*)&client_addr.sin_addr, (char*)&b, sizeof(client_addr.sin_addr));

printf(
"server:%s\n", inet_ntoa(server_addr.sin_addr));
printf(
"client:%s\n", inet_ntoa(client_addr.sin_addr));

printf(
"server:%s\nclient:%s\n",
inet_ntoa(server_addr.sin_addr), inet_ntoa(client_addr.sin_addr));

printf(
"server:%s\nclient:%s\n",
inet_ntoa(client_addr.sin_addr), inet_ntoa(server_addr.sin_addr));

return0;
}

复制代码输出为:

运行结果如下

server:255.48.32.16
client:255.96.80.64
server:255.48.32.16
client:255.48.32.16
server:255.96.80.64
client:255.96.80.64

分别打印server和client的地址,得到正确的值,但是使用同一条printf语句打印却出现一些问题。

其中的原因是inet_ntoa返回值存储在一块静态空间中,第二次调用的返回值会覆盖第一次的结果,printf的是从右往左计算参数,所以会出现打印相同地址的情况

转载于:https://www.cnblogs.com/chllovegeyuting/archive/2012/08/19/2646285.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值