打印

关于强制类型转换的一点收获

[复制链接]
639|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
强制类型转换


我们知道,强制类型转换分为隐性类型转换以及显性类型转换。对于隐性转换,它的转换由编译器完成,它总是由少字节类型转换为多字节类型。显性类型转换则根据程序员的需要强制某种数据类型转换为另一种数据类型。 这个没毛病。


那么,强制类型转换的一个陷阱在哪呢 - 指向不同数据类型的指针之间的转换,让我们来看下面一个例子。

file:///C:/Users/Administrator/AppData/Local/YNote/data/qq3F3AF51F618E47699C3A439CE720209B/14fee9473e0b4641bd1c678c18c08901/clipboard.png
我们看到,数据结果并不是我们预期的。那么,造成这种原因是什么呢?
程序中test变量是字符型,它对应的指针是一个指向字符类型的指针(&test),而p1是指向int类型指针。当把test变量的地址强制转换为int型指针并给p1后,实际p1的指向的是被扩展了内存单元的test地址。如下图
file:///C:/Users/Administrator/AppData/Local/YNote/data/qq3F3AF51F618E47699C3A439CE720209B/1efae4cb315f4e278ffa406553a99fd9/clipboard.png

由此可知,p1指向的值就是test1部分的数据加上了地址扩展部分的数据。所以,在打印*p1的时候打印的值不是50,而是一个意料之外的值。


同理,如果使用int型指针指向double型指针时也会出现内存被截取的问题。


那可能你要问了,不同类型指针之间的转换会出现地址扩展与截断的问题,那为什么变量之间的类型转换就不会出现这种问题呢?


其实,不论是不同指针类型之间的转换还是不同数据类型之间的转换都会发生截取与扩张的问题。不同数据类型之间的转换编译器通过高字节补0或者高字节截取的办法来解决,并没有发生内存单元的缩小与扩展。而不同指针类型之间的转换编译器则是通过内存扩张与缩小来解决,这就会导致出现如上所示的问题。


相关帖子

沙发
红蛋大叔|  楼主 | 2017-11-3 21:48 | 只看该作者

使用特权

评论回复
板凳
zxq6| | 2017-11-3 22:09 | 只看该作者
我都喜欢定义指针,下一行再赋值,没这么在定义的时候赋值操作过。所以感觉是把test的地址赋值给了*p,出现了错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

69

帖子

3

粉丝