inet_ntoa之坑------再谈不可重入函数中的static

本文通过一个简单的C++程序示例展示了inet_ntoa函数的使用方法,并揭示了其因内部使用static变量而导致的不可重入问题。文章强调了在多线程环境下使用该函数可能遇到的问题。

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

      不想用过多的话语来啰嗦, 还是看代码吧(如下结果非常让人吃惊):

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

int main()
{
    unsigned long n1 =  inet_addr("10.213.120.1");
	unsigned long n2 =  inet_addr("172.18.18.1");
	
	struct in_addr stAddr1, stAddr2;
	stAddr1.s_addr = n1;
	stAddr2.s_addr = n2;
	
	printf("%lu\n", n1);
    printf("%lu\n", n2);

    char *p1 = inet_ntoa(stAddr1);
	char *p2 = inet_ntoa(stAddr2);

    printf("%s\n", p1);
    printf("%s\n", p2);
	
    return 0;
}
       结果:

taoge@localhost Desktop> g++ test.cpp 
taoge@localhost Desktop> ./a.out 
24696074
17961644
172.18.18.1
172.18.18.1


      为什么是相同的ip呢? 因为在inet_ntoa中static定义, 那为什么知道有static定义呢? 看看inet_ntoa的原型就基本明白了:char *inet_ntoa(struct in_addr in);   要返回char *, 而入参没有char *, 那几乎就是要用static了啊, 看了一下inet_ntoa的实现, 果然如此。

      static引起的不可重入问题, 我们已经讨论过了, 便不过多聊。

      总之, 不可重入函数就是坑, inet_ntoa便是其中之一。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值