Re: [討論] 請板友幫忙review置底13誡

作者: Frozenmouse (*冰之鼠*)   2016-04-16 18:59:21
正式開槍
首先是錯字:
「10. 不可在 stack 設置過大的變數,否則會造成 stack overflow」
內文中,static / globla variable 應為 global
再來是這次的主角,null pointer:
「03. 你不可以提取(dereference)不知指向何方的指標(包含 null 指標)。」
「06. 你不可以只做 malloc(), 而不做相應的 free(). 否則會造成記憶體漏失」
至少在這兩條中,內文的字句已經隱含了 NULL == 0
(甚至可能 == nullptr,不過在撰文當時 C++11 應該還沒出現就是了)
例如,在 06 中關於 delete 判斷的部分
前面說「把指標指到 0」,但後面提供的例子卻 assign 為 NULL
03 則更是直接,範例裡指到 0 然後馬上後面跟註解「起始化為 null pointer」
雖然在大部分的狀況下是對的,在某些狀況下編譯器也可能會自動幫你轉換
但仍不能完全排除 NULL 不是 0 的可能性,且 0 也未必是不能使用的位址
參考前陣子的討論 #1MwJjpRh (C_and_CPP)
和較久以前的討論 #1Ddq9rDu (C_and_CPP)
以現在的寫法,很容易讓人誤解 NULL 就一定是 0、0 就是空指標
既然置底十三誡的定位是給新手看的,用詞有必要更精確一些
我認為在這個前提下,NULL 和 0 混用並不是一個適當的寫法
至於怎麼改,我還沒想到,各種語言標準其實我也不太熟 Orz
也許可以先把內文的 0 指標全換成 NULL
也許可以新增一段解釋 0、NULL 和 C++ 後來新增的 nullptr 的差別…
作者: wtchen (沒有存在感的人)   2016-04-16 19:03:00
感謝,在C11 standard是這樣定義:6.3.2.3-3: An integer constant expression with thevalue 0, or such an expression cast to type void *,is called a null pointer constant.If a null pointer constant is converted to a pointertype, the resulting pointer, called a null pointer,is guaranteed to compare unequal to a pointer to anyobject or function.所以我們不能說NULL是0,這是有問題的。至於要怎麼說怎麼解釋給新手聽,還要再想想 Orz
作者: Frozenmouse (*冰之鼠*)   2016-04-16 19:18:00
還有要怎麼解釋 if (ptr) { //blah } 這種寫法 XD
作者: Caesar08 (Caesar)   2016-04-16 20:14:00
樓上那個只要把pointer的值取出來就好就跟int i=/*number*/; if(i)一樣
作者: Frozenmouse (*冰之鼠*)   2016-04-16 20:31:00
上面那條是((void*)0) -> 空指標,反過來一樣嗎@@
作者: Caesar08 (Caesar)   2016-04-16 20:37:00
只要是指標,就會儲存一個記憶體位置直接讀取指標(不加*),就是讀取記憶體位置現在void pointer指向0,所以if(ptr)就是if(0)
作者: Frozenmouse (*冰之鼠*)   2016-04-16 20:48:00
我的意思是有沒有規定像你說的那樣把 null pointer轉回數值確定是 0 XD還是我哪裡有誤解…
作者: Caesar08 (Caesar)   2016-04-16 22:02:00
N4582 http://imgur.com/ZseDxIWThe macro NULL is an implementation-defined C++ nullpointer constant in this International StandardN4582, 18.2, 3但我覺得C++11都出了,為何不用nullptr?直接警告新手,使用nullptr而不是0或NULL
作者: wtchen (沒有存在感的人)   2016-04-16 22:11:00
可是C11沒有nullptr....
作者: Caesar08 (Caesar)   2016-04-16 22:14:00
... 還好我都是寫C++而不是C
作者: Frozenmouse (*冰之鼠*)   2016-04-16 22:17:00
感謝樓上m(_ _)m
作者: wtchen (沒有存在感的人)   2016-04-16 22:18:00
錯字改掉了,至於NULL那邊要怎麼改寫還要想 QQ
作者: Caesar08 (Caesar)   2016-04-16 22:22:00
那C與C++可能要分開了,現在nullptr就出問題了
作者: wtchen (沒有存在感的人)   2016-04-16 22:33:00
我不反對分開,但是要有人寫C++的部份阿
作者: Caesar08 (Caesar)   2016-04-16 22:37:00
只針對13誡,提供C++方面的幫助?(C++要注意太多了)
作者: wtchen (沒有存在感的人)   2016-04-16 22:39:00
也行,再看看怎麼補充。其實我覺得13誡可能不夠要再加...
作者: Frozenmouse (*冰之鼠*)   2016-04-16 22:40:00
照其他條那樣 C++ 用補述的呢?
作者: Caesar08 (Caesar)   2016-04-16 22:40:00
像這邊就有C++的guideline https://goo.gl/aHndRh
作者: wtchen (沒有存在感的人)   2016-04-16 22:41:00
也是個好方法,C++就勞煩各位幫忙(板工現在忙C的部份)
作者: Caesar08 (Caesar)   2016-04-16 22:41:00
已經有多位大師都在幫忙寫這文件,應該不用質疑正確性吧
作者: Frozenmouse (*冰之鼠*)   2016-04-16 22:41:00
那個連結看到 editors 直接跪了
作者: wtchen (沒有存在感的人)   2016-04-17 02:03:00
C的NULL是null pointer constant (空指標常數?)
作者: Frozenmouse (*冰之鼠*)   2016-04-17 02:08:00
直覺上應該是,而且常被定義為 ((void*)0)((void*)0)符合你引的C11規範裡的 null ptr const
作者: wtchen (沒有存在感的人)   2016-04-17 02:16:00
繁體中文翻譯成空指標常數沒錯吧?話說該怎麼跟新手解釋..看來真的該新增一條解釋NULL,'\0',0,nullptr的關係有人可以幫忙寫嗎?要寫得讓新手了解...嗯...不過想想好像沒特殊必要,NULL跟0搞不清楚應該不會毀滅地球....
作者: Frozenmouse (*冰之鼠*)   2016-04-17 03:57:00
'\0'==0應該沒問題,先以推廣不要直接把0當null ptr為開始如何?單純「凡指標必使用NULL / nullptr」這樣詳細怎麼補述還得再想想…
作者: wtchen (沒有存在感的人)   2016-04-17 17:22:00
目前先把3跟6的0改成NULL,至於怎麼敘述nullptr再想想對了誡3的gets()應該要換掉,不是安全的函式
作者: dreamnook (亞龍)   2016-04-20 10:01:00
朝聖推XD
作者: Yshuan (倚絃)   2016-04-20 17:12:00
用德文念就沒問題了(亂入

Links booklink

Contact Us: admin [ a t ] ucptt.com