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

看板C_and_CPP作者 (*冰之鼠*)時間8年前 (2016/04/16 18:59), 編輯推噓16(16041)
留言57則, 5人參與, 最新討論串2/2 (看更多)
正式開槍 首先是錯字: 「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 的差別… -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.228.129.217 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460804364.A.381.html

04/16 19:03, , 1F
感謝,在C11 standard是這樣定義:
04/16 19:03, 1F

04/16 19:03, , 2F
6.3.2.3-3: An integer constant expression with the
04/16 19:03, 2F

04/16 19:04, , 3F
value 0, or such an expression cast to type void *,
04/16 19:04, 3F

04/16 19:04, , 4F
is called a null pointer constant.
04/16 19:04, 4F

04/16 19:05, , 5F
If a null pointer constant is converted to a pointer
04/16 19:05, 5F

04/16 19:05, , 6F
type, the resulting pointer, called a null pointer,
04/16 19:05, 6F

04/16 19:06, , 7F
is guaranteed to compare unequal to a pointer to any
04/16 19:06, 7F

04/16 19:06, , 8F
object or function.
04/16 19:06, 8F

04/16 19:06, , 9F
所以我們不能說NULL是0,這是有問題的。至於要怎麼說
04/16 19:06, 9F

04/16 19:07, , 10F
怎麼解釋給新手聽,還要再想想 Orz
04/16 19:07, 10F

04/16 19:18, , 11F
還有要怎麼解釋 if (ptr) { //blah } 這種寫法 XD
04/16 19:18, 11F

04/16 20:14, , 12F
樓上那個只要把pointer的值取出來就好
04/16 20:14, 12F

04/16 20:15, , 13F
就跟int i=/*number*/; if(i)一樣
04/16 20:15, 13F

04/16 20:31, , 14F
上面那條是((void*)0) -> 空指標,反過來一樣嗎@@
04/16 20:31, 14F

04/16 20:37, , 15F
只要是指標,就會儲存一個記憶體位置
04/16 20:37, 15F

04/16 20:38, , 16F
直接讀取指標(不加*),就是讀取記憶體位置
04/16 20:38, 16F

04/16 20:38, , 17F
現在void pointer指向0,所以if(ptr)就是if(0)
04/16 20:38, 17F

04/16 20:48, , 18F
我的意思是有沒有規定像你說的那樣把 null pointer
04/16 20:48, 18F

04/16 20:48, , 19F
轉回數值確定是 0 XD
04/16 20:48, 19F

04/16 20:48, , 20F
還是我哪裡有誤解…
04/16 20:48, 20F

04/16 22:02, , 21F
04/16 22:02, 21F

04/16 22:03, , 22F
The macro NULL is an implementation-defined C++ null
04/16 22:03, 22F

04/16 22:03, , 23F
pointer constant in this International Standard
04/16 22:03, 23F

04/16 22:03, , 24F
N4582, 18.2, 3
04/16 22:03, 24F

04/16 22:05, , 25F
但我覺得C++11都出了,為何不用nullptr?
04/16 22:05, 25F

04/16 22:05, , 26F
直接警告新手,使用nullptr而不是0或NULL
04/16 22:05, 26F

04/16 22:11, , 27F
可是C11沒有nullptr....
04/16 22:11, 27F

04/16 22:14, , 28F
... 還好我都是寫C++而不是C
04/16 22:14, 28F

04/16 22:17, , 29F
感謝樓上m(_ _)m
04/16 22:17, 29F

04/16 22:18, , 30F
錯字改掉了,至於NULL那邊要怎麼改寫還要想 QQ
04/16 22:18, 30F

04/16 22:22, , 31F
那C與C++可能要分開了,現在nullptr就出問題了
04/16 22:22, 31F

04/16 22:33, , 32F
我不反對分開,但是要有人寫C++的部份阿
04/16 22:33, 32F

04/16 22:37, , 33F
只針對13誡,提供C++方面的幫助?(C++要注意太多了)
04/16 22:37, 33F

04/16 22:39, , 34F
也行,再看看怎麼補充。
04/16 22:39, 34F

04/16 22:40, , 35F
其實我覺得13誡可能不夠要再加...
04/16 22:40, 35F

04/16 22:40, , 36F
照其他條那樣 C++ 用補述的呢?
04/16 22:40, 36F

04/16 22:40, , 37F
像這邊就有C++的guideline https://goo.gl/aHndRh
04/16 22:40, 37F

04/16 22:40, , 38F
我指 nullptr 那邊XD
04/16 22:40, 38F

04/16 22:41, , 39F
也是個好方法,C++就勞煩各位幫忙(板工現在忙C的部份)
04/16 22:41, 39F

04/16 22:41, , 40F
已經有多位大師都在幫忙寫這文件,應該不用質疑正確性吧
04/16 22:41, 40F

04/16 22:41, , 41F
那個連結看到 editors 直接跪了
04/16 22:41, 41F

04/17 02:03, , 42F
C的NULL是null pointer constant (空指標常數?)
04/17 02:03, 42F

04/17 02:08, , 43F
直覺上應該是,而且常被定義為 ((void*)0)
04/17 02:08, 43F

04/17 02:09, , 44F
((void*)0)符合你引的C11規範裡的 null ptr const
04/17 02:09, 44F

04/17 02:16, , 45F
繁體中文翻譯成空指標常數沒錯吧?話說該怎麼跟新手解釋..
04/17 02:16, 45F

04/17 02:17, , 46F
看來真的該新增一條解釋NULL,'\0',0,nullptr的關係
04/17 02:17, 46F

04/17 02:18, , 47F
有人可以幫忙寫嗎?要寫得讓新手了解...嗯...
04/17 02:18, 47F

04/17 02:34, , 48F
不過想想好像沒特殊必要,NULL跟0搞不清楚應該不會
04/17 02:34, 48F

04/17 02:34, , 49F
毀滅地球....
04/17 02:34, 49F

04/17 03:57, , 50F
'\0'==0應該沒問題,先以推廣不要直接把0當null ptr
04/17 03:57, 50F

04/17 03:57, , 51F
為開始如何?
04/17 03:57, 51F

04/17 03:58, , 52F
單純「凡指標必使用NULL / nullptr」這樣
04/17 03:58, 52F

04/17 03:59, , 53F
詳細怎麼補述還得再想想…
04/17 03:59, 53F

04/17 17:22, , 54F
目前先把3跟6的0改成NULL,至於怎麼敘述nullptr再想想
04/17 17:22, 54F

04/17 17:24, , 55F
對了誡3的gets()應該要換掉,不是安全的函式
04/17 17:24, 55F

04/20 10:01, , 56F
朝聖推XD
04/20 10:01, 56F

04/20 17:12, , 57F
用德文念就沒問題了(亂入
04/20 17:12, 57F
文章代碼(AID): #1N4XiCE1 (C_and_CPP)
文章代碼(AID): #1N4XiCE1 (C_and_CPP)