Re: [问题] 为什么两个 pointer 不能转 const

楼主: purpose (秀才遇到肥宅兵)   2015-02-08 21:21:54
接前一篇的讨论,我来解释看看为什么 const int 和 const int * 就可以?
首先强调一下,类似的事件,都会有一个被害人跟加害人。
而这样的转型:
int **ptr;
const int **thirdparty = ptr;
往往是被加害人利用来作案的第三者。
被害人:
受到 const 保护,可能被存放在唯读区域的资料物件,
比如
const Dog lucky; 或 const int maxNum;
加害人:
Dog *p2lucky; 或 int *p2maxNum;
加害人往往透过 p2lucky->modify(xxx); 或 *p2maxNum = -1; 这样的指令,
去破坏编译器承诺的 const 保护。
但是正常情况下,编译器不允许 p2maxNum = &maxNum; 这类转型,
所以被害者与加害者,就好像白富美与鲁肥宅一样,
肥宅连走近白富美一公尺都做不到,因此犯罪事件无法发生。
但是,这个世界上是有扫厕所阿姨的,阿姨刚好就是能沟通白富美与鲁肥宅的关键,
阿姨即为案件中的第三者 const int **thirdparty;
首先肥宅会乔装成好人,骗阿姨把扫厕所的工作机会交给他:
const int **thirdparty = &p2maxNum;
编译器就好像阿姨的上司,如果是遵守 C++ 标准的编译器,
会在这个时候就禁止阿姨让“乔装后的肥宅”(&p2maxNum) 混进来。
当肥宅混进去后,就会利用扫厕所的机会,接触被害人:
*thirdparty = &maxNum;
已知 thirdparty 等于 &p2maxNum,代入上式得到
*(&p2maxNum) = &maxNum;
将 *& 相抵销,就得到
p2maxNum = &maxNum;
所以编译器原本禁止的转型,最终还是被无知的扫厕所阿姨破坏掉,让肥宅得逞:
*p2maxNum = -1;
然后不意外的话,会因为违法写入内存,程式在执行时期会当掉。
回到最前面的问题,为什么 const int ** 不行,而 const int * 就可以。
以上面的白富美为例,她的型态是 const int,要攻击她就得是 int * 的指标。
今天 const int* 如果接受了攻击者 int * 的位置:
const int *扫厕所阿姨 = 鲁肥宅; // int *鲁肥宅
那就没有空间可以去跟白富美接触。
反之,如果
const int *扫厕所阿姨 = &白富美: // const int 白富美;
那同样也没有空间去跟肥宅接触。
因此 const int * 这样的阿姨,是毫无杀伤力的阿姨,编译器无须限制,无须理会。
作者: b98901056 (岳岳)   2015-02-08 21:49:00
好生动XD 推
作者: johnjohnlin (嗯?)   2015-02-08 22:00:00
比喻好好笑 w
作者: Killercat (杀人猫™)   2015-02-08 22:18:00
大推 今年以来看到最棒的比喻 :D
作者: holydc (のヮの)   2015-02-08 23:43:00
身为穷鲁臭酸肥宅超有感!!!!感谢说明 o'_'o
作者: EdisonX (卡卡兽)   2015-02-08 23:45:00
鲁肥仔签到^^

Links booklink

Contact Us: admin [ a t ] ucptt.com