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

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

是在网络编程中用到的,因为需要根据新加入的用户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. iOS 事件传递及响应过程

    iOS 事件传递及响应过程 -->>事件到来-->>事件分发 -->>事件响应 事件( Events) 官方文档( Events(iOS)) 是这样描写叙述的: U ...

  2. 类的专有方法(__getattr__和__setattr__、__delattr__)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...

  3. HTML+CSS浏览器兼容性问题

    浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同 问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大. 碰到频率:100% 解决方案:CSS里    ...

  4. JavaScript原生实现《贪吃蛇》

    概述 JavaScript原生实现<贪吃蛇>,每吃掉一个食物,蛇的身体会变长,食物会重新换位置. 详细 代码下载:http://www.demodashi.com/demo/10728.h ...

  5. PHP-表达式

    最精确的定义一个表达式的方式就是"任何有值的东西" $a = 5; 1 > 2;等

  6. 【转载】Delphi下实现鼠标自动点击器

    本文最早于2009年6月1日在编程论坛(programbbs.com)上发表,页面地址:http://programbbs.com/bbs/view12-20849-1.htm . 众所周知,当鼠标指 ...

  7. 更改虚拟内存(使用于win7、win8系统)

    在使用电脑的过程中你肯定有这样的抱怨吧!电脑为什么越来越慢?C盘为什么越来越小?我们都非常清楚:C盘剩余空间量的大小,很大程度上决定着我们在使用电脑的过程中程序运行的速度.随着电脑软件越装越多,尽管我 ...

  8. html学习第一讲(内容html常规控件的的使用)

    <html> <head> <title> 这是网页的标题</title> </head> <body> <h2>& ...

  9. HDUOJ---2082

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. iOS 排序算法总结、二分法查找

    1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插 ...