inet_ntoa问题记录
来源:互联网 发布:单片机u盘方案 编辑:程序博客网 时间:2024/05/14 04:11
今天在写代码时遇到一个问题并于在一个函数传递参数时连续调用inet_ntoa时出现的,下面是问题的模拟代码:
16 char ip_addr1[]="192.168.1.20";
17 char ip_addr2[]="192.168.1.40";
18
19 int main(int argc,char**argv)
20 {
21 struct in_addr addr1, addr2;
22 char ip1[16]={0}, ip2[16]={0};
23
24 bzero(&addr1,sizeof(structin_addr));
25 bzero(&addr2,sizeof(structin_addr));
26
27 inet_aton(ip_addr1,&addr1);
28 inet_aton(ip_addr2,&addr2);
29
30 printf("ip address 1:%s\tip address 2:%s\n", inet_ntoa(addr1),
inet_ntoa(addr2));
31
32 return 0;
33 }
ip address 1:192.168.1.20 ip address 2:192.168.1.40
可是结果是:
ip address 1:192.168.1.20 ip address 2:192.168.1.20
当时遇到这个问题的时候没太注意,可以费了我好长时候才去去关注它,这里只是猜出inet_ntoa的实现方法,并没有去阅读他的实现代码,先看下面的例子:
5 //str must end with null, and its size must be less 1024 bytes
6 char* alltoupper(constchar* str){
7 #define BUF_LEN 1024
8 static char buf[BUF_LEN];
9 int idx=0;
10 if(!str)returnNULL;
11 if(strlen(str)>=BUF_LEN)returnNULL;
12 while(*str!='\0'){
13 if(idx<BUF_LEN){
14 buf[idx++]=toupper(*str++);
15 }
16 }
17 buf[idx]='\0';
18 return buf;
19 #undef BUF_LEN
20 }
21
22 int main(int argc,char** argv){
23 printf("%s\t%s\n",alltoupper("hello,world!"),alltoupper("That's what it is!"));
24 return 0;
25 }
HELLO,WORLD! HELLO,WORLD!
是不是和上面的一样的?
其实这里面的道理很简单,返从函数返回指针,要么是静态变量,要么是malloc等分配的动态变量,要么是传递进去的内存指针。而这里的三种情况中,第二种情况,个人认为是最好不要用的,内存应该谁分配谁释放,但是另一个函数strdup确是使用了第二种方法。
对于返回函数内部的静态变量虽然出了函数作用域,其变量名无效了,但其分配的空间还在,再次进入同一个函数时,不会再次对静态变量进行初始化的,所以在一个函数传递参数的时候,同时调用两次这类函数,对同一个静态变量,实际上是后者覆盖了前者,两都都是指向同一个内容,所以会出现上面两段代码的结果。
由于没有真正的看过inet_ntoa函数的实现,这里只是过行猜测,不过这个道理是存在的,以后有时间再阅读一下其实现吧。
- inet_ntoa问题记录
- inet_ntoa()的问题
- inet_ntoa 的问题
- inet_ntoa()
- inet_ntoa()
- inet_ntoa()
- inet_ntoa()
- inet_ntoa
- inet_ntoa
- inet_ntoa()多次调用时的问题
- 64位linux中的inet_ntoa问题
- Linux 64位系统下inet_ntoa报段错误问题
- inet_ntoa只能转化IP地址 不能转域名的问题
- 关于VS2013下inet_ntoa函数不能使用的问题
- Linux 64位系统下 inet_ntoa 报段错误问题
- inet_ntoa 函数
- inet_ntoa解密
- inet_ntoa()原创
- ssh-keygen后,仍提示需要密码
- 读取103收货冻结的function
- Eclipse 中,JS报错
- volatile浅谈
- static和const关键字的用法
- inet_ntoa问题记录
- diamond专题(一)– 简介和快速使用
- 关于ssh 配置文件的参数说明
- doxygen lua
- 数据库里面使用ContentProvider
- diamond专题(二)– 核心原理介绍
- [BetterExplained]为什么你应该(从现在开始就)写博客
- linux设备驱动模型一概述
- 针对基类引用符指向派生类对象引起的思考