作者Frozenmouse (*冰之鼠*)
看板C_and_CPP
标题Re: [讨论] 请板友帮忙review置底13诫
时间Sat Apr 16 18:59:21 2016
正式开枪
首先是错字:
「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/cn.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
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
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