日志
((M *)0)->b;肯定会出错,而&(((M *)0)->b)这样写为什么不报错?
2013-01-17 20:11
int a = ((M *)0)->b;肯定会出错。为什么int a = &(((M *)0)->b);就没有问题呢?
答:((M *)0)->p是得到p的地址后取出p的值由于p所指向的是不可读地址,因此引发CPU一般保护异常,而&(((M *)0)->p)从语义上看,代码编写人是想得到p成员的偏移量,程序运行时,虽然0加上p的偏移的内存空间不可读,但是并没有读取内存的值,而是直接将这个值也就是偏移赋给了变量,所以不会引发CPU一般保护异常,所以没有问题。 |