C_and_CPP 板


LINE

正式開槍 首先是錯字: 「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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1460804364.A.381.html
1F:推 wtchen: 感謝,在C11 standard是這樣定義: 04/16 19:03
2F:→ wtchen: 6.3.2.3-3: An integer constant expression with the 04/16 19:03
3F:→ wtchen: value 0, or such an expression cast to type void *, 04/16 19:04
4F:→ wtchen: is called a null pointer constant. 04/16 19:04
5F:→ wtchen: If a null pointer constant is converted to a pointer 04/16 19:05
6F:→ wtchen: type, the resulting pointer, called a null pointer, 04/16 19:05
7F:→ wtchen: is guaranteed to compare unequal to a pointer to any 04/16 19:06
8F:→ wtchen: object or function. 04/16 19:06
9F:→ wtchen: 所以我們不能說NULL是0,這是有問題的。至於要怎麼說 04/16 19:06
10F:→ wtchen: 怎麼解釋給新手聽,還要再想想 Orz 04/16 19:07
11F:→ Frozenmouse: 還有要怎麼解釋 if (ptr) { //blah } 這種寫法 XD 04/16 19:18
12F:→ Caesar08: 樓上那個只要把pointer的值取出來就好 04/16 20:14
13F:→ Caesar08: 就跟int i=/*number*/; if(i)一樣 04/16 20:15
14F:→ Frozenmouse: 上面那條是((void*)0) -> 空指標,反過來一樣嗎@@ 04/16 20:31
15F:→ Caesar08: 只要是指標,就會儲存一個記憶體位置 04/16 20:37
16F:→ Caesar08: 直接讀取指標(不加*),就是讀取記憶體位置 04/16 20:38
17F:→ Caesar08: 現在void pointer指向0,所以if(ptr)就是if(0) 04/16 20:38
18F:→ Frozenmouse: 我的意思是有沒有規定像你說的那樣把 null pointer 04/16 20:48
19F:→ Frozenmouse: 轉回數值確定是 0 XD 04/16 20:48
20F:→ Frozenmouse: 還是我哪裡有誤解… 04/16 20:48
21F:→ Caesar08: N4582 http://imgur.com/ZseDxIW 04/16 22:02
22F:→ Caesar08: The macro NULL is an implementation-defined C++ null 04/16 22:03
23F:→ Caesar08: pointer constant in this International Standard 04/16 22:03
24F:→ Caesar08: N4582, 18.2, 3 04/16 22:03
25F:→ Caesar08: 但我覺得C++11都出了,為何不用nullptr? 04/16 22:05
26F:→ Caesar08: 直接警告新手,使用nullptr而不是0或NULL 04/16 22:05
27F:推 wtchen: 可是C11沒有nullptr.... 04/16 22:11
28F:→ Caesar08: ... 還好我都是寫C++而不是C 04/16 22:14
29F:→ Frozenmouse: 感謝樓上m(_ _)m 04/16 22:17
30F:推 wtchen: 錯字改掉了,至於NULL那邊要怎麼改寫還要想 QQ 04/16 22:18
31F:→ Caesar08: 那C與C++可能要分開了,現在nullptr就出問題了 04/16 22:22
32F:推 wtchen: 我不反對分開,但是要有人寫C++的部份阿 04/16 22:33
33F:→ Caesar08: 只針對13誡,提供C++方面的幫助?(C++要注意太多了) 04/16 22:37
34F:推 wtchen: 也行,再看看怎麼補充。 04/16 22:39
35F:推 wtchen: 其實我覺得13誡可能不夠要再加... 04/16 22:40
36F:→ Frozenmouse: 照其他條那樣 C++ 用補述的呢? 04/16 22:40
37F:→ Caesar08: 像這邊就有C++的guideline https://goo.gl/aHndRh 04/16 22:40
38F:→ Frozenmouse: 我指 nullptr 那邊XD 04/16 22:40
39F:推 wtchen: 也是個好方法,C++就勞煩各位幫忙(板工現在忙C的部份) 04/16 22:41
40F:→ Caesar08: 已經有多位大師都在幫忙寫這文件,應該不用質疑正確性吧 04/16 22:41
41F:→ Frozenmouse: 那個連結看到 editors 直接跪了 04/16 22:41
42F:推 wtchen: C的NULL是null pointer constant (空指標常數?) 04/17 02:03
43F:→ Frozenmouse: 直覺上應該是,而且常被定義為 ((void*)0) 04/17 02:08
44F:→ Frozenmouse: ((void*)0)符合你引的C11規範裡的 null ptr const 04/17 02:09
45F:推 wtchen: 繁體中文翻譯成空指標常數沒錯吧?話說該怎麼跟新手解釋.. 04/17 02:16
46F:推 wtchen: 看來真的該新增一條解釋NULL,'\0',0,nullptr的關係 04/17 02:17
47F:推 wtchen: 有人可以幫忙寫嗎?要寫得讓新手了解...嗯... 04/17 02:18
48F:推 wtchen: 不過想想好像沒特殊必要,NULL跟0搞不清楚應該不會 04/17 02:34
49F:→ wtchen: 毀滅地球.... 04/17 02:34
50F:→ Frozenmouse: '\0'==0應該沒問題,先以推廣不要直接把0當null ptr 04/17 03:57
51F:→ Frozenmouse: 為開始如何? 04/17 03:57
52F:→ Frozenmouse: 單純「凡指標必使用NULL / nullptr」這樣 04/17 03:58
53F:→ Frozenmouse: 詳細怎麼補述還得再想想… 04/17 03:59
54F:推 wtchen: 目前先把3跟6的0改成NULL,至於怎麼敘述nullptr再想想 04/17 17:22
55F:推 wtchen: 對了誡3的gets()應該要換掉,不是安全的函式 04/17 17:24
56F:推 dreamnook: 朝聖推XD 04/20 10:01
57F:推 Yshuan: 用德文念就沒問題了(亂入 04/20 17:12







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP