[問題] (ptr == NULL) 和 (ptr) 的差別

看板C_and_CPP作者時間13年前 (2011/04/09 01:14), 編輯推噓3(3016)
留言19則, 7人參與, 最新討論串1/1
當測試指標的時候常會使用到例如: if (ptr != NULL) { free(ptr); ptr == NULL; } 但是看到一篇文章 Mozilla coding style寫道 https://developer.mozilla.org/En/Mozilla_Coding_Style_Guide - Don't use NULL for pointers. On some systems it's declared as void * and causes a compile warning when assigned to a pointer. Use 0 or nsnull instead. - When testing a pointer, use !myPtr or (myPtr); don't use myPtr != nsnull or myPtr == nsnull. - Do not compare x == PR_TRUE or x == PR_FALSE. Use (x) or (!x) instead. x == PR_TRUE, in fact, is different from if (x)! 我看到 void * 想說是否可攜性有關,例如 16bit or 32bit等等,不過又不是很確定, 讓我有些困惑,有人知道為什麼他會這樣寫嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.156.151

04/09 01:24, , 1F
昨天剛好問到,上網查了資料,sizeof(void/void*)確實有
04/09 01:24, 1F

04/09 01:24, , 2F
可攜性問題 http://ppt.cc/ioqE depends on machine.
04/09 01:24, 2F

04/09 01:27, , 3F
用 0 也有問題吧 ... 要是有的系統的 null_ptr 不是0呢
04/09 01:27, 3F

04/09 01:29, , 4F
0 只是一個標兵值, 當大家統一用某個奇怪的數值也無
04/09 01:29, 4F

04/09 01:30, , 5F
不可, 第一點確實有型態上不相容的問題, 第二點看看就
04/09 01:30, 5F

04/09 01:31, , 6F
好, 這樣只是極盡簡短程式碼而已, 對閱讀無益, 第三點
04/09 01:31, 6F

04/09 01:32, , 7F
是可以遵守, 前提是你命名都像像 is_avaiable、
04/09 01:32, 7F

04/09 01:33, , 8F
is_empty 一樣好讀  ×
04/09 01:33, 8F

04/09 01:33, , 9F
它用 !ptr 就已經算是假設 null==0 ... 這怎麼好像在
04/09 01:33, 9F

04/09 01:34, , 10F
砸自己的腳啊 ...
04/09 01:34, 10F

04/09 01:35, , 11F
當然有非0的NULL_ptr
04/09 01:35, 11F

04/09 01:35, , 12F

04/09 01:58, , 13F
pointer size本來就是target machine相依 一致即可~
04/09 01:58, 13F

04/09 01:59, , 14F
(void*) 比較難讓人接受的是 gcc會把 (void*)++當成char*
04/09 01:59, 14F

04/09 12:36, , 15F
推 firejox C FAQ
04/09 12:36, 15F

04/09 19:54, , 16F
但是我記得 C 語言規定數值 0 若轉成指標必須是 NULL 指標
04/09 19:54, 16F

04/09 19:54, , 17F
不管那個機器實際上的 NULL 指標值到底是多少...
04/09 19:54, 17F

04/09 19:55, , 18F
所以基本上用 0 一定是沒問題的
04/09 19:55, 18F

04/09 20:05, , 19F
04/09 20:05, 19F
文章代碼(AID): #1Ddq9rDu (C_and_CPP)