首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

&(((M *)零)->b)这样写为什么不报错

2013-01-23 
&(((M *)0)-b)这样写为什么不报错?int a ((M *)0)-b肯定会出错。为什么int a &(((M *)0)-b)就没有

&(((M *)0)->b)这样写为什么不报错?

int a = ((M *)0)->b;肯定会出错。

为什么int a = &(((M *)0)->b);就没有问题呢。

对他取地址就没有问题,这是什么情况???
[解决办法]
int a = ((M *)0)->b 是把0号地址开始的内存当成M 然后取M中的b赋值给a 
由于你要取b中的值 而b在0号地址开始的那段内存中 那是不可读的地址

int a = &(((M *)0)->b)
是取的b在M中的相对偏移位置,此时虽然b在0号地址开始的那段内存中 
但是你没有取b的值 因此没有触发不可读的限制 所以是没有问题的


[解决办法]
((M *)0)->p是得到p的地址后取出p的值由于p所指向的是不可读地址,因此引发CPU一般保护异常,而&(((M *)0)->p)从语义上看,代码编写人是想得到p成员的偏移量,程序运行时,虽然0加上p的偏移的内存空间不可读,但是并没有读取内存的值,而是直接将这个值也就是偏移赋给了变量,所以不会引发CPU一般保护异常,所以没有问题。

热点排行