关于inet_ntoa函数的思考
来源:互联网 发布:js 点击复制当前内容 编辑:程序博客网 时间:2024/04/30 07:13
最近写程序,发现一个有趣的问题。先看下面的代码:
#include <stdio.h>#include <stdlib.h>#include <WinSock2.h>#pragma comment(lib,"WS2_32")void main(){ struct in_addr addr1, addr2; unsigned int uip1, uip2; uip1 = inet_addr("127.0.0.1"); uip2 = inet_addr("172.16.16.123"); printf("整数形式为:ip1=%u,ip2=%u\n",uip1,uip2); //相反过程 memcpy(&addr1, &uip1, 4); memcpy(&addr2, &uip2, 4); printf("还原字符IP为:ip1=%s,ip2=%s\n",inet_ntoa(addr1),inet_ntoa(addr2)); system("pause");}
输出如下:
可见,并不是我们预想的结果。这是为什么呢?我们知道,printf函数赋值是“从右到左”,也就是说出现了覆盖的问题。那我们来分析下函数inet_ntoa的内部实现机制。
函数inet_ntoa返回了一个字符指针。自动变量在堆栈中分配内存,当包含自动变量的函数或者代码退出时,它所占用的内存空间就会被回收,为了能够在函数或者代码退出时,仍然能够访问这些变量的内存(得到正确的结果),可以通过下面几种方法:
(1)返回字符串常量。缺点是字符串c昂两不能修改,显然inet_ntoa函数不会采用方法;
(2)定义一个全局变量。缺点是函数外的代码也可以修改,显然我们从inet_ntoa函数的输入输出看,也不会是这种方法;
(3)使用静态变量(在函数体内部),缺点是每次调用,就会覆盖上一次的内容,显然inet_ntoa函数就是采用的这种方式。
(4)动态分配内存。(通过malloc等函数),我们设想如果inet_ntoa函数如果采用这种方式,那我们岂不没调用一次,还要释放一下内存?显然不可能。
通过分析,inet_ntoa函数的输入参数是unsigned int类型的ip地址,返回的却是指向ip字符串的指针,很明显,ip字符串所占的内存是在函数内部分配的,而我们并不需要释放该内存,所以,它分配的内存是静态的,也就是说下一次调用该函数时会覆盖这个数组的内容,所以就会出现上述的结果。
0 0
- 关于inet_ntoa函数的思考
- 关于inet_ntoa函数的思考
- 关于 inet_ntoa函数
- 关于 inet_ntoa函数
- 关于VS2013下inet_ntoa函数不能使用的问题
- 关于Linux的inet_addr inet_aton inet_ntoa 函数 和inet_pton inet_ntop函数
- inet_ntoa 函数
- 函数--inet_ntoa()
- inet_ntoa函数
- inet_ntoa函数
- 关于虚函数的思考
- 关于srand()函数的思考
- 关于strcpy函数的思考
- 关于Delay函数的思考
- 关于inet_ntoa使用需要注意的地方
- 关于in_addr 和inet_ntoa的用法
- 关于in_addr 和inet_ntoa的用法
- inet_ntoa 函数需要注意的地方
- Ruby attr_accessible, validates, attr_accessor, cattr_accessor 区别
- Regionals 2013 Asia - Daejeon (部分题目题解)
- C++异或运算符及作用
- 10个最未充分利用的ActiveRecord::Relation法
- 【php】让记事本成为你调控变量的控制台
- 关于inet_ntoa函数的思考
- kohana框架生成feed
- 使用 Ruby 解析CSV文件&YAML文件
- Ruby 之Gem kaminari 分页
- configure: error: you must configure in a separate build directory
- Ruby之 model.new_record? - parsent?
- Linux内核源代码情景分析-基于socket的进程间通信
- Spring学习笔记(6)---------IoC的三种注入方式
- 深入理解alias, alias_method和alias_method_chain