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/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
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灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP