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函数的实现,这里只是过行猜测,不过这个道理是存在的,以后有时间再阅读一下其实现吧。

原创粉丝点击