如果x+17/18=y+18/19,那么x>y。(判断对错)

在Ubuntu 14.04 LTS系统下采用g++ 4.8.4版本编译器编译該源文件并执行,得到的输出结果如下:
第6行定义了一个整型变量num并初始化为0x(十六进制表示),然后取num的地址用来初始化整型指针变量pnum接着到了关键的地方,使用reinterpret_cast运算符把pnum从int转变成char类型并用于初始化pstr

将pnum和pstr两个指针的值输出,对比发现两个指针的值是完全相同的,這是因为“reinterpret_cast 运算符并不会改变括号中运算对象的值而是对该对象从位模式上进行重新解释”。如何理解位模式上的重新解释呢通过推敲代码11行和12行的输出内容,就可见一斑

很显然,按照十六进制输出pnum指向的内容得到636261;但是输出pstr指向的内容,为什么会得到”abc”呢

在囙答这个问题之前,先套用《深度探索C++对象模型》中的一段话“一个指向字符串的指针是如何地与一个指向整数的指针或一个指向其他洎定义类型对象的指针有所不同呢?从内存需求的观点来说没有什么不同!它们三个都需要足够的内存(并且是相同大小的内存)来放置一个机器地址。指向不同类型之各指针间的差异既不在其指针表示法不同,也不在其内容(代表一个地址)不同而是在其所寻址出來的对象类型不同。也就是说指针类型会教导编译器如何解释某个特定地址中的内存内容及其大小。”参考这段话和下面的内存示意图答案已经呼之欲出了。
使用reinterpret_cast运算符把pnum从int转变成char类型并用于初始化pstr后pstr也指向num的内存区域,但是由于pstr是char类型的通过pstr读写num内存区域将不再按照整型变量的规则,而是按照char型变量规则一个char型变量占用一个Byte,对pstr解引用得到的将是一个字符也就是’a’。而在使用输出流输出pstr时将输出pstr指向的内存区域的字符,那pstr指向的是一个的字符那为什么输出三个字符呢?这是由于在输出char指针时输出流会把它当做输出一個字符串来处理,直至遇到’\0’才表示字符串结束对代码稍做改动,就会得到不一样的输出结果例如将num的值改为0x,输出的字符串就变为”ab”。

上面的例子融合了一些巧妙的设计我们在pstr指向的内存区域中故意地设置了结束符’\0’。假如将num的值改为0x运行结果会是怎样的呢?
上面是我测试的截图大家可以思考一下为什么在输出”abcd”之后又输出了6个字符才结束呢(提示:参考上面的内存示意图)?

但是在有些情况下就不会这么幸运了,迎接我们的很可能是运行崩溃例如我们直接将num(而不是pnum)转型为char*,再运行程序的截图如下
可以分析出程序在输出pstr时崩溃了,这是为什么呢pstr指向的内存区域的地址是0x,而这片内存区域很有可能并不在操作系统为当前进程分配的虚拟内存空間中从而导致段错误。

}

我要回帖

更多关于 x?x?x?16 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信