看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC (Ubuntu 4.8.2-19ubuntu1) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 只有 -lm 問題(Question): 大家好...我最近才剛接觸C 這邊問的感覺應該是小問題,不過google都查不到... 還請各位鞭小力點 最近在看一段code,其年代久遠(約1990) 可能是規範與現今有差異,或是當時平台不同(好像最早是在sparc上run的) code裏面常有一些疏漏 例如: 1. 令一變數int p,用以儲存從外部讀入的某個參數 之後為了要檢查是否有順利讀入,而使用了判斷式 if ( p == NULL ) 來檢查p是否仍在最初狀態而尚未儲存過資料 不過因為NULL約等於(void *)0 這樣做意味著對int與pointer做比較,而會出現 warning: comparison between pointer and integer [enabled by default] 奇怪的是如果我不理他的話,這個功能是不會出錯的 想問再出現[enabled by default]之後到底編譯器做了什麼事? 而且我不知道該如何修正... NULL改成0的話,要是讀入值真的是0就有問題了 或是我自己將初始直改成某個不可能會是讀入資料的數值呢?(例如負數) 2. 使用了malloc、exit、strlen卻沒有 #include <stdlib.h> 同樣的有warning出現 warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default] 這邊我也是很好奇不去include到底compiler會做什麼事 因為程式仍然可以執行,而且某些程式(很少,大約一兩個) 在我 #include <stdlib.h>之後 反而會出現 segmentation fault,讓我感到很疑惑 還煩請各位指點迷津,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.21.196 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416813244.A.8BF.html
azureblaze: 跑得了法律門(語言規範),躲不過道德門(良好習慣) 11/24 17:12
azureblaze: 所以能夠正常跑,但是開個警告給你看你要不要改 11/24 17:13
azureblaze: enable by default就是這種狀況gcc預設會警告你 11/24 17:13
azureblaze: 你也可以叫他閉嘴別雞婆,不建議就是了 11/24 17:14
azureblaze: 另外整數設為NULL就只是個0而已,不代表沒資料 11/24 17:15
azureblaze: 只有NULL pointer才代表沒東西 11/24 17:16
原來是這樣 我可能要去看一下NULL pointer的相關說明..
dirkc: NULL通常是個macro;例如#define NULL ((void*)0)或(0L) 11/24 18:21
dirkc: 據說比較舊的編譯器會#define NULL成一些別的值 11/24 18:22
dirkc: 所以"...改成某個不可能會是讀入資料的數值"是較建議的作法 11/24 18:23
dirkc: seg. fault應該有別的原因,要看code 11/24 18:25
感謝解答 至於seg. fault...因為目前對code理解還很亂 我先花點時間研究看看 ※ 編輯: k03004748549 (140.115.21.196), 11/24/2014 19:32:01
ZanFu5566: gdb 看看吧 11/25 01:22
Killercat: 其實C++11以後別再NULL了 用nullptr吧.... 11/25 18:53