本文主要是介绍inet_ntoa之坑------再谈不可重入函数中的static,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不想用过多的话语来啰嗦, 还是看代码吧(如下结果非常让人吃惊):
#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便是其中之一。
这篇关于inet_ntoa之坑------再谈不可重入函数中的static的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!