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

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

是在网络编程中用到的,因为需要根据新加入的用户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. Wide - Residual - Inception Networks for R eal - time O bject D etection

    本文的提出了一个WR-inception网络结构.只需更小的内存消耗和更小的计算量. 作者使用了一种微结构,整个宏观网络都是由这个微结构组成. 微结构 微结构的种类如下: 基本的残差结构(3*3,3* ...

  2. linux上传下载文件rz,sz

    [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum install lrzsz -y 注意:rhel安装完系统后 直接可使用 rz sz █ 法二:源文 ...

  3. Tomcat自带log的配置详解

    最近几天被日志搞得烦死了,不详细了解不行呀! Tomcat根目录文件作用说明 根目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹 bin目录 主要是用来存放t ...

  4. spring thymeleaf 自定义标签

    概述 thymeleaf2.1.5自定义标签及自定义属性案例,类似于JSP中的自定义JSTL标签 详细 代码下载:http://www.demodashi.com/demo/10495.html 一. ...

  5. 微信小程序“信用卡还款”项目实践

    小程序概述 11月3日晚,微信团队对外宣布,微信小程序开放公测.开发者可登陆微信公众平台申请,开发完成后可以提交审核,公测期间暂不能发布. 我们前一段时间也进行了小程序开发,现在来对之前的开发体验做一 ...

  6. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  7. Foundations of Machine Learning: The PAC Learning Framework(2)

    Foundations of Machine Learning: The PAC Learning Framework(2) (一)假设集有限在一致性下的学习界. 在上一篇文章中我们介绍了PAC-le ...

  8. WordPress网站搬家全过程 亲身体验WordPress搬家,总结几点

    需要移动的文件主要是网站文件和数据库文件,如果是简单的wordpress   操作就是:备份网站文件,导出数据库文件,上传网站文件,导入数据库文件,移动网站文件,修改wordpress的wp-conf ...

  9. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  10. MVC中JSON字符长度超出限制

    本文导读:在MVC中通过JsonResult返回JSON字符串时,如果字符串长度过长,会抛出使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 ...