写在前面的话:虽然这段代码中对于指针的使用是不正确的,但是我却在这个不正确的代码中发现了另一个错误,而且深感迷惑,所以打算将此博文推到首页,请各位帮忙回答个问题。

在项目中用到了以下一段代码,执行结果有点奇怪,还没有想明白为什么会这样子

是在网络编程中用到的,因为需要根据新加入的用户IP和已经存在的用户列表中的用户IP进行比对,来判定该用户是否已经存在,所以就使用了上述办法,但是执行结果出人意料,因为if(0 == strcmp(newIp, oldIp))这行代码永远为真,为什么呢?

自己就跟踪代码调试,结果当执行过第二个红线那一行之后,newIp的值也发生了改变,而且newIp和oldIp指向的地址是一样的,为什么这样子呢?

我的猜测是,由于inet_ntoa函数的执行过程会做一些我们不知道的事情,它的功能是将u_long的数据转换为字符串表示的点分十进制Ip地址,但是转换过之后这个Ip地址存储在哪里呢?我认为,它应该是开辟了一个存储空间来存放这个字符串,接着第二次执行这个函数的时候也是如此做的,而且使用的存储空间是同一个存储空间,所以才造成了现在这种情况。

于是我就修改了一下代码,给newIp分配一个存储空间,将inet_ntoa的结果放到这个存储空间中去,这样代码就按照自己的思路正确的执行了。下面是修改后的代码:

犯这样的错误,或许对于一个新手来说很正常,总的来说,还是使用指针的时候要小心,否则就会出现一些意料之外的诡异事件。。。

不过我还是有个小疑问,两次使用inet_ntoa结果得到的存储空间地址是相同的,这是个巧合还是必然会发生的呢?我的想法是调用这个函数,它会自动分配一个空间来存储,但是立刻就销毁了,而值还存在那里,第二次使用还是随机分配,地址相同只不过是因为分配空间的算法认为刚才那个空间是可用的,所以就将此空间又分配给它了,所以,我认为这是个巧合,如果两个函数离的比较远,也就是说它们之间还有别的函数需要动态分配空间,那么它们的值就不会一样了。

下面是两次的执行结果:

事实胜于雄辩,看着调试的代码,我发现自己的猜测是错的,我在两次函数调用中间利用new分配了一块存储空间,结果p1和p2的值还是一样的。我迷惑了,难道这个函数每次都用一样的地址么?不可能吧。。。

于是我继续做下面的测试,在另外一个函数中使用该函数inet_ntoa,执行结果如下:

第一个函数中:

第二个函数中:

好吧,看到它们的地址,我彻底的迷惑了,我的猜测确实是错的,可是还是那个问题,为什么这个函数每次执行分配的存储空间都一样呢?

虽然还是带着自己的疑问结束了这个博客,但是也学到了很多的东西,遇到问题按着自己的思路去思考就好了,没必要一遇到问题就上网上搜去,当然我也不反对上网找资料,但是现在的现象是往往很多问题在网上都是重复的,搜来搜去都是一样,从这个网站转到另一个网站,而且这样的答案对自己的问题还没有什么价值。

我认为遇到问题,首先应该自己去思考解决思路,不要怕困难,其实当你真正的去做的时候才会发现并不是那么困难,而且这样更可以增加自己技术的增长,怎么说呢,我认为抄来的东西还是没有自己琢磨出来的知识让自己印象更深刻。

后面这段话可能不太符合某些人的观点,那么请保持绅士风度,因为我们应该让我们听到不同的声音,这样我们才能知道跟自己不同的观点。

谢谢这评论中两位的回答,我总结以下问题的答案,就是这个函数会把执行结果放在一个静态存储区,它保证在同一线程中下一次执行Socket函数之前,数据是有效的,所以,我们应该在下次执行Socket函数之前将数据拷贝出来。这里我只是保存了它的指针,所以,在下次执行此函数时,数据被覆盖了。

详见百度百科:inet_ntoa()

图片:

又谈C++指针(1)的更多相关文章

  1. Objective-C 再谈OC指针,对比C++/Java/Swift

    1.Objective-C的指针 OC一直是人感觉比较变态的一门语言,为什么呢?因为它的每个变量都是指针型,多的都几乎让人忘了那个*的存在了. 比如我定义了一个Student的Class,new了st ...

  2. 【洛谷日报#75】浅谈C++指针

    放入我的博客食用效果更佳(有很多oi学习资料) 1.指针基础 1.引用 C++有一个东西叫引用,引用相当于给对象(如:变量)起了另一个名字,引用必须用对象初始化,一旦初始化,引用就会和初始化其的对象绑 ...

  3. [转]浅谈C++指针直接调用类成员函数

    找了一番之后发现这篇文章讲的很清楚. 传送门

  4. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  5. (转) 谈C/C++指针精髓

    原文:http://www.cnblogs.com/madengwei/archive/2008/02/18/1072410.html   [摘要]    指针是C和C++语言编程中最重要的概念之一, ...

  6. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  7. node c++多线程插件 第二天 c++指针

    虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...

  8. C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)

    前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...

  9. 浅谈 C 语言中模块化设计的范式

    今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...

随机推荐

  1. 1z0-052 q209_8

    8: Note the following structures in your database server: 1. Extents 2. OS Blocks 3. Tablespace 4. S ...

  2. java 将字符串数组变为字典顺序排序后的字符串数组

    import java.util.ArrayList; import java.util.Collections; import java.util.List; public class String ...

  3. 好记性不如烂笔头77-多线程-Thread子类的线程对象是不同的

    Thread子类的线程对象是不同的. 比方: EasySelfThread thread = new EasySelfThread(); //同一个线程对象 Thread t1 = new Threa ...

  4. isearch5 index,attribute和summary。

    索引 isearch5 支持的索引分为:index,attribute和summary. Index指的是倒排索引,它存储了存储了从term到DocID的映射关系,形如: term-->(Doc ...

  5. ibatis 批量更新(一)

      1.4.2.3 批量修改 支持单个动态更新.批量动态更新 <update id="updateCONSULT_SCHEDULEDynamic" parameterClas ...

  6. 全球免费知名DNS服务器

    全球免费知名DNS服务器 jalone 2013-06-18 14:25:46 最近老是发表DNS相关文章,今天继续说DNS,国内75%以上的家用宽带路由器存在严重的安全隐患:用户浏览网页的时候其DN ...

  7. 机器学习的敲门砖:手把手教你TensorFlow初级入门

    摘要: 在开始使用机器学习算法之前,我们应该首先熟悉如何使用它们. 而本文就是通过对TensorFlow的一些基本特点的介绍,让你了解它是机器学习类库中的一个不错的选择. 本文由北邮@爱可可-爱生活  ...

  8. 在ListView的右边添加字母列表

    在ListView的右边添加字母列表,点击某个字母时,列表就滚动到预期位置. <!-- 数字和字母栏在标题栏下边并且停靠在右边 --> <com.txrj.sms.component ...

  9. 搭建Hexo博客并部署到Github

    参考: http://www.jianshu.com/p/a67792d93682 http://jingyan.baidu.com/article/d8072ac47aca0fec95cefd2d. ...

  10. nginx error: upstream prematurely closed connection while reading response header from upstream

    本篇文章由:http://xinpure.com/nginx-error-upstream-prematurely-closed-connection-while-reading-response-h ...