看板 C_and_CPP 關於我們 聯絡資訊
接前一篇的討論,我來解釋看看為什麼 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 * 這樣的阿姨,是毫無殺傷力的阿姨,編譯器無須限制,無須理會。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.8.135.72 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1423401723.A.45A.html
b98901056: 好生動XD 推 02/08 21:49
johnjohnlin: 比喻好好笑 w 02/08 22:00
Killercat: 大推 今年以來看到最棒的比喻 :D 02/08 22:18
holydc: 身為窮魯臭酸肥宅超有感!!!!感謝說明 o'_'o 02/08 23:43
EdisonX: 魯肥仔簽到^^ 02/08 23:45
bibo9901: 02/08 23:57