1、指標與null
下面這段**會報錯:
指標初始化為null,還是沒有分配記憶體,所以會報錯。指標是個變數,就是個裝位址的變數,是變數就可以重複使用。
而平時之所以讓指標指向null,是防止誤用了野指標修改隨機記憶體。但具體使用前一定要保證已分配記憶體了。
2、ndebug與assert
**自:
標頭檔案assert.h定義的巨集受ndebug的影響.如果預程式在處理這個標頭檔案時已經定義了ndebug,assert巨集的內容就定義為空,這意味著assert巨集不在起作用.所以,可以在最終發布程式的時候可以使用-dndebug關閉斷言功能或者把#define ndebug加到每個原始檔中,但這條語句必須放在#include 之前.
1 #include2#define ndebug //
要加在#include前面 #include
3int
main()
4
trace(),assert()都只是在debug的模式下才起作用的,如果定義了ndebug,編譯器會認為是非debug的模式(雖然編譯出來的程式還是很大,而且還可以進行除錯),此時trace(),assert()就沒有用了.就如同你編譯成release版的時候這些沒有用一樣。efine debug 會重新開啟除錯開關
3、作用域與static、extern
舉個例子,同乙個工程下:
(1)在file.c中定義全域性變數int a = 9,則在file2.c中不允許在全域性下重定義變數a,但允許在語句"extern int a;"後可以訪問file.c中的a。
(2)在file.c中定義全域性變數static int a = 9,則a為file.c的檔案作用域,在file2.c中無法訪問。
4、不要寫歧義的操作
比如下面這句話,對n的操作有歧義,究竟是左值中的n是n+1還是n呢?
threadhandle[n]=createthread( null, 0, comp, &varr[n++], 0, null );
類似的,f1()*f2()中,哪個先計算呢,在c++中,規定運算元計算順序的的只有(), ?: 和 , ,此外其他操作符並未指定運算元的求值順序,這類表示式的行為沒有明確定義。
所以若運算元計算順序會影響結果,最好可以寫成更清晰地形式
1 threadhandle[n]=createthread( null, 0, comp, &varr[n], 0, null );
2 n++; //
不要把n的操作放在上面的表示式中,有歧義,易出錯
C 常見錯誤
1.用malloc或farmalloc動態分配記憶體時,如 char buffer buffer char malloc 300 因為並不是在所有的情況下,都會分配成功 所以應加 if buffer null 2.char far buffer buffer char far farmalloc s...
c常見錯誤
11.error c2017 illegal escape sequence 中文對照 轉義字元非法 分析 一般是轉義字元位於 或 之外,例如 char error n 12.error c2018 unknown character 0xhh 中文對照 未知的字元0xhh 分析 一般是輸入了中文標...
C語言 常見錯誤
1.忘記定義變數。2.輸入輸出的資料的型別與所用格式說明符不一致。3.未注意 型資料的數值範圍。4.在輸入語句scanf中忘記使用變數的位址符。5.輸入資料的形式與要求不符。6.誤把 作為 等於 運算子。7.語句後面漏分號。8.在不該加分號的地方加了分號。9.對應該有花括號的復合語句,忘記加花括號。...